相当新的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()
的结果,但我没有看到任何其他方式收集单个项目。
我在这里看到的另一个问题是,并行线程将继续在列表中执行,直到它们完成迭代。我希望每个工人都能在发现物品时提前结束。
答案 0 :(得分:2)
正如JB所说,你可以使用Stream#findAny
,这是一个终端操作,它将返回你正在寻找的元素Optional
。
return itemList.parallelStream()
.filter(item -> item.itemData().dataId() == searchData.itemData().dataId())
.findAny()
.orElse(null);