2017-04-27 34 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 –