2017-12-06 34 views
12

मैं दो दिए गए ऑब्जेक्ट्स की तुलना करना चाहता हूं जो रनटाइम पर शून्य हो सकते हैं। मेरे उदाहरण में:मैं लैम्ब्डा तुलनित्रों में 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)); 
} 

अभिकथन आईडी से ठीक काम करता है, प्रकार नहीं है द्वारा a1.getType() रिक्त है के रूप में। इससे बचने का कोई रास्ता है क्या? मैंने Comparator.nullsLast(...) की कोशिश की, लेकिन इसका कोई मतलब नहीं है क्योंकि मैं यहां तत्वों को सॉर्ट नहीं कर रहा हूं।

मेरे पास बहुत सारे दावे हैं, इसलिए मैं "एक-लाइनर" पसंद करूंगा। मैं लैम्ब्डा अभिव्यक्तियों के लिए नया हूँ।

+0

के बाद से मौजूद है क्यों आप 'equals' विधि का उपयोग करें चाहते है? – ByeBye

+0

मैं _Agent_ के कार्यान्वयन को बदलने में सक्षम नहीं हूं और कोई हैशकोड/बराबर नहीं है। – JaneDoe

+0

'nullsLast' के साथ क्या गलत है? – immibis

उत्तर

12

यदि आप इसे एक जुनीट परीक्षण में उपयोग करना चाहते हैं, तो आप उन वस्तुओं को क्यों पास नहीं करते हैं जिन्हें आप सीधे assertEquals विधि से तुलना करना चाहते हैं?

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

यह परीक्षण विफल होने पर जुनीट को एक उपयोगी त्रुटि संदेश उत्पन्न करने में भी मदद करता है।

आप उत्पादन कोड में ऐसा करना चाहते हैं, तो आप Objects.equals उपयोग कर सकते हैं:

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

जो जावा 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.equals आपके लिए null हैंडल करता है।

+0

आह! ठीक है, मेरे बुरे – Eugene

संबंधित मुद्दे