ストリームをフィルタリングした後に値が存在しない場合に、何らかの動作を行う方法を知りたいです。
そのコードを考えてみましょう:
foo.stream().filter(p -> p.someField == someValue).findFirst().ifPresent(p -> {p.someField = anotherValue; someBoolean = true;});
値が存在しない場合、Else
の後にある種のifPresent
を配置するにはどうすればよいですか?
StreamにはorElse
の後に呼び出すことができるfindFirst
メソッドがいくつかありますが、それらのorElse
でそれを行う方法がわかりません。
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;
});