2017-04-27 3 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를 반환 할 수 있습니까? 내가는 다음과 같이, 반환이 거짓 추가하려고 :Java 8 forEach에 대한 반송

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

하지만 누가 나를 봐 도움이 될 수 있습니다 예기치 않은 표현이다?

+4

'forEach'를 사용하지 않음. 모든 요소가 조건을 충족시키는 지 확인하려면'allMatch'를 사용하고 싶습니다. 그건 그렇고, 당신은 pretest를'if (! aMap.keySet(). equals (bMap.keySet()) false false; '로 바꿀 수있다. 이것은 맵의 크기 이상을 검사하고'null' 테스트를 생략 할 수있다. – Holger

+0

빠른 응답을 보내 주셔서 감사합니다. –

+0

@Holger 안녕하세요. http://stackoverflow.com/questions/43973596/how-to-convert-foreach-to-lambda –

답변

4

빈 형식의 메서드 인 소비자 기능 인터페이스를 구현하는 람다 식이므로 false를 반환 할 수 없습니다. 대신

는 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 –