2017-07-05 11 views
2

Javaのストリームよりもむしろ新しいストリームです。私はいくつかの例を見てきましたが、どれも私のユースケースに適合していないようです。並列ストリームを使用してコレクション内の単一のオブジェクトを検索する

私は指数関数的に増加する可能性のあるオブジェクトのリストを持っており、このリスト内の単一のアイテムを見つけるために使用しているループを並列化したいと思います。ここで

は、私が現在持っているものである:ここでは

for (Node node : itemList) 
{ 
    if (node.itemData().dataId() == searchData.itemData().dataId()) 
     return node; 
} 

return null; 

は、このループの同時バージョン

List<Node> nodeItem = itemList.parallelStream() 
           .filter(item -> item.itemData().dataId() == searchData.itemData().dataId()) 
           .collect(Collectors.toList()); 

return (!nodeItem.isEmpty() ? nodeItem.get(0) : null); 

私はここで見ています二つの問題がありますで私の試みです。最初の1つは、この単一のエントリをListに入れていることです。私はこれがcollect()の結果であることを理解していますが、個々のアイテムを収集する他の方法はありません。

私がここで見る他の問題は、並列化されたスレッドが反復処理を完了するまでリストの各部分を処理し続けることです。その商品が見つかったときに各従業員が時期尚早に終了するように指示された場合、私は好むでしょう。

+4

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#findAny-- –

+0

@JBNizetありがとうございます。 – user0000001

答えて

2

JBが述べたように、あなたが探している要素のOptionalを返す端末操作であるStream#findAnyを使用することができます。

return itemList.parallelStream() 
       .filter(item -> item.itemData().dataId() == searchData.itemData().dataId()) 
       .findAny() 
       .orElse(null); 
関連する問題