यह एक सरल प्रश्न हो सकता है, लेकिन मैं यह स्पष्ट रूप से समझने के लिए चाहते हैं ...जावा 8 तुलनाकारी nullsFirst naturalOrder उलझन
मैं इस तरह एक कोड है:
public final class Persona
{
private final int id;
private final String name
public Persona(final int id,final String name)
{
this.id = id;
this.name = name;
}
public int getId(){return id;}
public String getName(){return name;}
@Override
public String toString(){return "Persona{" + "id=" + id + ", name=" + name+'}';}
}
और मैं इस कोड का परीक्षण कर रहा हूँ :
Persona{id=5, name=null}
Persona{id=4, name=Chinga}
Persona{id=1, name=Cristian}
Persona{id=3, name=Cristina}
Persona{id=2, name=Guadalupe}
:
import static java.util.Comparator.*;
private void nullsFirstTesting()
{
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
final List<Persona>persons = Arrays.asList(new Persona(1,"Cristian"),new Persona(2,"Guadalupe"),new Persona(3,"Cristina"),new Persona(4,"Chinga"),new Persona(5,null));
persons
.stream()
.sorted(comparator)
.forEach(System.out::println);
}
यह निम्न परिणाम दिखाता है
ये परिणाम मेरे साथ ठीक हैं लेकिन मुझे समझ में समस्या है।
जब मैं new Persona(5,null)
वस्तु पर ध्यान न दें और मैं तुलनित्र पारित:
final Comparator<Persona>comparator = comparing(Persona::getName);
यह एक आकर्षण की तरह काम करता है। मेरा सॉर्टिंग natural order of name property
है। समस्या तब उत्पन्न होती है जब मैं name=null
के साथ ऑब्जेक्ट जोड़ता हूं, मैंने सोचा कि मुझे इस तरह के तुलनित्र की आवश्यकता होगी।
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());
मेरे बारे में सोचा था गलत: "ठीक है, जब नाम में गैर-शून्य है, वे natural order of name
में सिर्फ पिछले तुलनित्र की तरह हल कर रहे हैं, और अगर वे null
हैं वे पहली बार मेरी गैर होगा लेकिन शून्य नाम अभी भी प्राकृतिक क्रम में क्रमबद्ध किए जाएंगे "।
लेकिन सही कोड यह है:
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
मैं nullsFirst
पैरामीटर समझ में नहीं आता। मैंने सोचा कि natural order of name
स्पष्ट रूप से [डिफ़ॉल्ट] null
मानों को संभालेगा।
लेकिन डॉक्स कहते हैं:
एक अशक्त के अनुकूल है तुलनित्र कि
null
समझता है रिटर्न से गैर-शून्य कम होने के लिए। जबnull
दोनों होते हैं, तो उन्हें बराबर माना जाता है। यदि दोनों गैर-शून्य हैं, तो आदेश निर्धारित करने के लिए निर्दिष्टComparator
का उपयोग किया जाता है। यदि निर्दिष्ट तुलनित्रnull
, है तो लौटा हुआ तुलनित्र सभी गैर-शून्य मानों को बराबर मानता है।
यह पंक्ति: "यदि दोनों गैर-शून्य हैं, तो निर्दिष्ट Comparator
आदेश निर्धारित करने के लिए उपयोग किया जाता है।"
मैं उलझन में हूं कि कब और कैसे प्राकृतिक आदेश स्पष्ट रूप से सेट किया जाना चाहिए या जब उनका अनुमान लगाया जाए।
नोट उत्पादन का उत्पादन * "अगर निर्दिष्ट तुलनित्र 'शून्य' है, तो लौटा तुलनित्र सभी गैर-शून्य मानों को बराबर मानता है। "* दूसरे शब्दों में, आप 'nullsFirst (null)' कर सकते हैं; हालांकि यह नॉन-नल को सॉर्ट किए बिना मोर्चे पर सामने की ओर जाता है। डॉक्टर वास्तव में इसे अच्छी तरह से समझाता है। – Radiodef
@chiperotiz तो आप अंततः इसे कैसे हल किया? क्या आप पहले नल और फिर प्राकृतिक आदेश से सॉर्ट करने में सक्षम थे? – Unheilig
हां इस कोड का उपयोग करके 'अंतिम तुलनाकर्ता तुलनित्र = तुलना करना (पर्सना :: getName, nullsFirst (प्राकृतिक ऑर्डर())); –
chiperortiz