2017-04-27 61 views
1
Boolean isSuccess = true; 
    if(aMap.size() != bMap.size()) 
    { 
     return false; 
    } 

    aMap.entrySet().forEach(entry -> { 
     AKey aKey = entry.getKey(); 
     BValue bValue = bMap.get(aKey); 

     if(bValue == null) 
      return; 

     AValue aValue = entry.getValue(); 
     if(!aValue.getClosed().equals(bValue.getClosed())) 
      return; 

     if(!aValue.getClosedToArrival().equals(bValue.getClosedToArrival())) 
      return; 

     if(!aValue.getClosedToDeparture().equals(bValue.getClosedToDeparture())) 
      return; 

     if(!aValue.getLengthOfStayArrival().equals(bValue.getLengthOfStayArrival())) 
      return; 
    }); 

    return isSuccess; 

如何驗證失敗時返回false? 我試圖添加返回false,如下面:返回關於Java 8 for each

if(!aValue.getLengthOfStayArrival().equals(bValue.getLengthOfStayArrival())) 
     return false; 

卻是意外的表情,誰可以幫我看一下嗎?

+4

不使用'forEach'。當你想檢查所有元素是否滿足條件時,你想使用'allMatch'。順便說一句,你可以改變你的預測試爲'if(!aMap.keySet()。equals(bMap.keySet())return false;'這會檢查地圖的大小,並且允許忽略'null'測試 – Holger

+0

感謝您的快速回復 –

+0

@Holger嗨,你能幫忙回答一個問題嗎?http://stackoverflow.com/questions/43973596/how-to-convert-foreach-to-lambda –

回答

4

您不能返回false,因爲您處於實現Consumer功能接口的lambda表達式中,該方法是void類型。

相反,使用anyMatch或noneMatch或allMatch:

return aMap.entrySet().stream().anyMatch(entry -> { 
    return false;// Put your condition here 
}); 

我也建議讓您的管道看起來像這樣來提取的方法驗證:

return aMap.entrySet() 
      .stream() 
      .anyMatch(this::checkIfMatch); 

大部分的時間當打開{}時,應該創建一個新方法是一個好兆頭。

+2

好吧,在這種情況下,您可以將表達式重寫爲不帶大括號的形式,即'x - > condition1 && condition2 && condition3 ...',但它仍然非常大以至於推薦使用專用方法,尤其是因爲它具有更通用的用途,比較'AValue'和'BValue'對象,這些對象在其他地方也可能有用。 – Holger

+1

非常感謝 –

+0

不客氣@HavenLin –