2017-12-06 17 views
12

Tôi muốn so sánh hai đối tượng đã cho có thể là null khi chạy. Trong ví dụ của tôi:Làm thế nào để tránh NullPointerExceptions trong bộ so sánh lambda?

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

Xác nhận theo id hoạt động tốt, theo loại không phải là a1.getType() là null. Có cách nào để tránh điều này không? Tôi đã thử Comparator.nullsLast(...), nhưng điều đó không có ý nghĩa vì tôi không sắp xếp các yếu tố ở đây.

Tôi có rất nhiều xác nhận để làm, vì vậy tôi muốn "một lót". Tôi mới với các biểu thức lambda.

+0

Tại sao bạn không muốn sử dụng 'phương pháp equals'? – ByeBye

+0

Tôi không thể thay đổi triển khai _Agent_ và không có hashCode/equals. – JaneDoe

+0

Điều gì sai với 'nullsLast'? – immibis

Trả lời

12

Nếu bạn chỉ muốn sử dụng điều này trong một bài kiểm tra JUnit, tại sao bạn không vượt qua các đối tượng bạn muốn so sánh trực tiếp với phương pháp assertEquals?

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

Điều này cũng giúp JUnit tạo ra thông báo lỗi hữu ích khi thử nghiệm không thành công.

Nếu bạn muốn làm điều này trong mã sản xuất, bạn có thể sử dụng Objects.equals:

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

mà hiện diện kể từ Java 7.

10

Something như thế này:

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

Vì bạn cần điều này sẽ được sử dụng ở nhiều nơi hơn, bạn có thể trích xuất nó như là:

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

Bạn có thể sử dụng Objects.equals:

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

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

Objects.equals xử lý null giây cho bạn.

+0

ah! đúng, xấu của tôi – Eugene

Các vấn đề liên quan