2017-07-05 45 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); 

的併發版本的嘗試有兩個問題我在這裏看到的。第一個是我將這個單項輸入List。我明白這是collect()的結果,但我沒有看到收集單個物品的其他方式。

我在這裏看到的另一個問題是,並行線程將繼續工作,直到他們完成迭代。如果發現每個工人被發現信號時,我寧願過早地結束。

+4

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

+0

@JBNizet謝謝。 – user0000001

回答

2

正如JB所述,您可以使用Stream#findAny,一個終端操作,將返回您正在尋找的元素Optional

return itemList.parallelStream() 
       .filter(item -> item.itemData().dataId() == searchData.itemData().dataId()) 
       .findAny() 
       .orElse(null); 
相關問題