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