2014-09-19 125 views
1

我有一个方法使用parallelStream来运行检查碰撞的对象的ArrayList,但我不知道如何从forEach()方法内的这种lambda表达式返回一个值。这是不可能的吗?从paralell流中返回一个值? java

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。谢谢。

回答

3

如果你只是想检查是否任何值匹配的预测,你可以使用anyMatch:此流的任何元素

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

这是一个短路终端操作。

所以你的情况:

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

一般情况下,我建议看下来StreamCollectors文档。我在.NET中使用LINQ的经验 - 不完全相同,但类似 ​​- 这种数据处理方式最适合用于转换和聚合方面; forEach总是一种“最后的手段”,当你只想对每个值采取动作,而不是得到结果

+0

谢谢你的建议! – zephos2014 2014-09-19 06:21:38

3

如果testRect.intersects确实除了测试碰撞没有,你可以切换到

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

其中anyMatch返回true如果条件给出列表中的任何pS匹配,如果这样退出循环。

+0

谢谢!这很棒! – zephos2014 2014-09-19 06:21:14