2016-10-16 6 views
1

Listの要素を見つけることは可能ですか、それとも要素が見つからない場合はExceptionをJava 8ストリームを使用してスローしますか?リスト内の要素を見つけ、stream()を使用して変更してください

つまり、streamを使用して次のコードを書き直したいと思います。私が得ることができる最高のものは、アイテムの値を変更することですが、アイテムが見つかったか変更されたかを知る方法はありません。

boolean isFound = false; 
for (MyItem item : myList) { 
    if (item.getValue() > 10) { 
     item.setAnotherValue(5); 
     isFound = true; 
    } 
} 

if (!isFound) { 
    throw new ElementNotFoundException("Element 10 wasn't found"); 
} 

答えて

3

あなたの目標はただ一つの要素を見つけることが、あなたは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が返されます。

+0

'AtomicBoolean'の解決策はひどいです。新しいブール値[1]、(b、x)、(3)、(4) @ 0:= true;}、(b1、b2) - > b1 [0] | = b2 [0])[0]; ' – Holger

+0

@Holger:まあまあまあソリューションは特にエレガントです。あるいは、並列ストリームでその 'AtomicBoolean'を使うときに、競合に問題があると思いますか? – user140547

+0

この場合、競合ではなく(すべてのコンシューマが 'cas 'を実行するのではなく)、各要素の処理の間にメモリバリアがあり、ホットスポットの最適化を妨げます。これは、シーケンシャル実行の場合でもそうです。この 'AtomicBoolean'は純粋にローカルなものであることが分かります。 'collect'演算は非常にエレガントではないかもしれませんが、' mapping(x - > {x.setAnotherValue(5); return true;}、reduce(false、Boolean :: logicalOr)) 'とはまったく同じです。ああ待って、それは代替のかもしれない... – Holger

関連する問題