2017-07-05 40 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); 
相关问题