2017-12-06 37 views
12

런타임시 null 일 수있는 두 개의 지정된 오브젝트를 비교하려고합니다. 내 예제에서 : 유형 a1.getType()가 null로하지 않습니다에 의해 ID로람다 비교기에서 NullPointerExceptions을 피하는 방법은 무엇입니까?

@Test 
public void shouldCompareAgents() { 

    Agent a1 = new Agent(); 
    a1.setId("4711"); 
    a1.setType(null); 

    Agent a2 = new Agent(); 
    a2.setId(a1.getId()); 
    a2.setType(a1.getType()); 

    assertEquals("Agent.getId", 0, 
      Comparator.comparing(Agent::getId).compare(a1, a2)); 

    assertEquals("Agent.getType", 0, 
      Comparator.comparing(Agent::getType).compare(a1, a2)); 
} 

어설 션이, 잘 작동합니다. 이것을 피할 수있는 방법이 있습니까? 나는 Comparator.nullsLast(...)을 시도했지만, 여기서는 요소를 정렬하지 않으므로 의미가 없습니다.

나는 단언 할 것이 많기 때문에 "one-liner"을 선호한다. 나는 람다 식을 처음 사용한다. 이 같은

+0

부터 존재

if (Objects.equals(a1.getId(), a2.getId())) { ... } 

당신이'equals' 방법을 사용하려는 해달라고 이유는 무엇입니까? – ByeBye

+0

_Agent_ 구현을 변경할 수 없으며 hashCode/equals가 없습니다. – JaneDoe

+0

'nullsLast'의 문제점은 무엇입니까? – immibis

답변

12

JUnit 테스트에서 이것을 사용하려면 비교하려는 객체를 assertEquals 메소드에 직접 전달하지 않으시겠습니까?

assertEquals("Agent.getId", a1.getId(), a2.getId()); 

이는 또한 JUnit이 테스트가 실패 할 때 유용한 오류 메시지를 생성하는 데 도움이됩니다. 프로덕션 코드에서이 작업을 수행하려면

, 당신은 Objects.equals 사용할 수 있습니다 자바 7

10

뭔가 :

private static <R, T extends Comparable<T>> boolean areEqual(R left, R right, Function<R, T> function) { 
     return Comparator.comparing(
       function, 
       Comparator.nullsLast(Comparator.naturalOrder())) 
          .compare(left, right) == 0; 
} 
5

사용할 수 Objects.equals :

assertEquals("Agent.getId", true, 
    Objects.equals(a1.getID(),a2.getID()); 

assertEquals("Agent.getType", true, 
    Objects.equals(a1.getType(),a2.getType()); 
당신이 더 많은 장소에서 사용이 필요하기 때문에

Comparator.comparing(Agent::getType, 
    Comparator.nullsLast(Comparator.naturalOrder())) 

, 당신은으로 추출 할 수 있습니다

Objects.equalsnull s를 처리합니다.

+0

아! 맞아, 내 나쁜 – Eugene