使用并行流在集合中查找单个对象

时间:2017-07-05 16:14:51

标签: java multithreading parallel-processing java-stream

相当新的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()的结果,但我没有看到任何其他方式收集单个项目。

我在这里看到的另一个问题是,并行线程将继续在列表中执行,直到它们完成迭代。我希望每个工人都能在发现物品时提前结束。

1 个答案:

答案 0 :(得分:2)

正如JB所说,你可以使用Stream#findAny,这是一个终端操作,它将返回你正在寻找的元素Optional

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