あなたの目標はただ一つの要素を見つけることが、あなたはifPresentOrElse
を使用して、Javaの9で
MyItem item = l.stream()
.filter(x -> x.getValue() > 10)
.findAny() // here we get an Optional
.orElseThrow(() -> new RuntimeException("Element 10 wasn't found"));
item.setAnotherValue(4);
を行う可能性がある場合、これは(残念ながら、構文()->{throw new RuntimeException();}
も少しあると幾分簡素化することができます)不器用な、しかし、私の知る限り、それを簡略化することができません。
l.stream()
.filter(x -> x.getValue() > 10)
.findAny() // here we get an Optional
.ifPresentOrElse(x->x.setAnotherValue(5),
()->{throw new RuntimeException();});
あなたはすべての項目にそれをしたい場合は、あなたがそのような何かを試すことができます。 Javaの8つのストリームは、副作用を経由して動作させるために、このことはありません本当にきれいなアプローチに設計されていないとして、しかし:もちろん
AtomicBoolean b = new AtomicBoolean(false);
l.stream()
.filter(x -> x.getValue() > 10)
.forEach(x->{
x.setAnotherValue(5);
b.set(true);
});
if (b.get()){
throw new RuntimeException();
}
を、あなたはまた、単にリストに要素を収集してから操作を行うことができます。しかし、これが単純なfor-loopよりも改善されているかどうかはわかりません。
もしもforEach
が返された場合は、呼び出された要素の数を表すlong
が返されます。
'AtomicBoolean'の解決策はひどいです。新しいブール値[1]、(b、x)、(3)、(4) @ 0:= true;}、(b1、b2) - > b1 [0] | = b2 [0])[0]; ' – Holger
@Holger:まあまあまあソリューションは特にエレガントです。あるいは、並列ストリームでその 'AtomicBoolean'を使うときに、競合に問題があると思いますか? – user140547
この場合、競合ではなく(すべてのコンシューマが 'cas 'を実行するのではなく)、各要素の処理の間にメモリバリアがあり、ホットスポットの最適化を妨げます。これは、シーケンシャル実行の場合でもそうです。この 'AtomicBoolean'は純粋にローカルなものであることが分かります。 'collect'演算は非常にエレガントではないかもしれませんが、' mapping(x - > {x.setAnotherValue(5); return true;}、reduce(false、Boolean :: logicalOr)) 'とはまったく同じです。ああ待って、それは代替のかもしれない... – Holger