从并行流中返回一个值? java的

时间:2014-09-19 06:03:32

标签: java java-stream

我有一个方法使用parallelStream来运行检查冲突的对象的ArrayList,但是我不确定如何从forEach()方法中的这种lambda表达式返回一个值。这不可能吗?

public static boolean isColliding(Ship moveingShip){

    Rectangle2D testRect = moveShip.getContainer(); //gets the rectangle to test

    GameManager.getArrayList().parallelStream().forEach((pS) ->
                               {if(testRect.intersects(pS.getContainer())) {//return boolean}});

    return //true or false depending on whether any collisions were detected
}

我不认为forEach方法有返回类型,所以我有点卡住了。除了恢复顺序forEach循环之外,还有另一种方法吗?使用并行流的目的是希望更快地通过ArrayList。感谢。

2 个答案:

答案 0 :(得分:3)

如果testRect.intersects除了测试碰撞之外什么都不做,你可以切换到

GameManager.getArrayList().parallelStream().anyMatch((pS) ->
                           {if(testRect.intersects(pS.getContainer())) {//return boolean}});

如果给定的条件与列表中的任何anyMatch匹配,则true返回pS,如果是,则退出循环。

答案 1 :(得分:3)

如果您只是想检查任何值是否与预测相​​匹配,可以使用anyMatch

  

返回此流的任何元素是否与提供的谓词匹配。如果不是确定结果所必需的,则不能评估所有元素的谓词。如果流为空,则返回false并且不评估谓词。

     

这是一种短路终端操作。

所以在你的情况下:

return GameManager
    .getArrayList()
    .parallelStream()
    .anyMatch(pS -> testRect.intersects(pS.getContainer()));

一般情况下,我建议您查看StreamCollectors文档。我在.NET中使用LINQ的经验 - 不完全相同,但相似 - 当你在转换和聚合方面进行思考时,这样的数据处理效果最好;当您只想对每个值执行操作而不是获取结果时,forEach总是一种“最后的手段”。