2014-09-19 61 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