2017-12-06 10 views
12

Ich möchte zwei gegebene Objekte vergleichen, die zur Laufzeit null sein könnten. In meinem Beispiel:Wie vermeide ich NullPointerExceptions in Lambda-Komparatoren?

@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)); 
} 

Die Behauptung von id funktioniert gut, nach Typ nicht der Fall ist, wie a1.getType() null ist. Gibt es eine Möglichkeit, dies zu vermeiden? Ich habe versucht Comparator.nullsLast(...), aber das macht keinen Sinn, da ich hier Elemente nicht sortiere.

Ich habe viele Behauptungen zu tun, also würde ich "Ein-Liner" bevorzugen. Ich bin neu für Lambda-Ausdrücke.

+0

Warum Sie nicht wollen, 'equals' Methode verwenden? – ByeBye

+0

Ich bin nicht in der Lage, die Implementierung von _Agent_ zu ändern und es gibt keinen hashCode/equals. – JaneDoe

+0

Was ist los mit 'nullsLast'? – immibis

Antwort

12

Wenn Sie dies nur in einem JUnit-Test verwenden möchten, übergeben Sie die Objekte, die Sie vergleichen möchten, direkt an die assertEquals-Methode?

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

Dies hilft auch JUnit, eine nützliche Fehlermeldung zu generieren, wenn der Test fehlschlägt.

Wenn Sie dies in der Produktion Code tun möchten, können Sie Objects.equals verwenden:

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

die seit Java vorhanden ist 7.

10

Etwas wie folgt aus:

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

Da Sie diese brauchen an mehr Orten verwendet werden, können Sie es als extrahieren:

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

können Sie verwenden Objects.equals:

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

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

Objects.equals behandelt null s für Sie.

+0

ah! Richtig, mein Schlechter – Eugene