web-dev-qa-db-ja.com

ifPresentStreamのその他のメソッド

ストリームをフィルタリングした後に値が存在しない場合に、何らかの動作を行う方法を知りたいです。

そのコードを考えてみましょう:

foo.stream().filter(p -> p.someField == someValue).findFirst().ifPresent(p -> {p.someField = anotherValue; someBoolean = true;}); 

値が存在しない場合、Elseの後にある種のifPresentを配置するにはどうすればよいですか?

StreamにはorElseの後に呼び出すことができるfindFirstメソッドがいくつかありますが、それらのorElseでそれを行う方法がわかりません。

8
Johnny Willer

findFirstは、このストリームの最初の要素を説明するOptionalを返します。ストリームが空の場合は、空のオプションを返します。

Optionalが空でないときに関数を適用する場合は、mapを使用する必要があります。 orElseGetが空の場合、Optionalは別のラムダを呼び出すことができます。

foo.stream()
   .filter(p -> p.someField == someValue)
   .findFirst().map(p -> {
       p.someField = anotherValue;
       someBoolean = true;
       return p;
   }).orElseGet(() -> {
       P p = new P();
       p.someField = evenAnotherValue;
       someBoolean = false;
       return p;
   });
10