जावा 8 से पहले, हम Comparable.compareTo(...)
इस तरह लागू किया इस:जावा 8 के Comperator.comparing (...) के साथ CompareToBuilder बदलें thenComparing (...)
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
नया जावा 8 रास्ता हमें commons-lang3
निर्भरता छोड़ने के लिए अनुमति दे सकते हैं। क्या नया जावा 8 रास्ता तेज है? क्या स्वचालित रूप से माइग्रेट करने का कोई तरीका है? मुझे इसके लिए इंटेलिजे इरादा नहीं मिला।
सूचना जब वहाँ रिवर्स आदेश और गैर प्राकृतिक तुलना कर रहे हैं शामिल है कि यह थोड़ा और अधिक जटिल हो जाता है:
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return new CompareToBuilder()
.append(b.hasAnyFailure(), a.hasAnyFailure()) // Reverse
.append(a.getAverageScore(), b.getAverageScore(), resilientScoreComparator)
.toComparison();
}
हो जाता है
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return Comparator
.comparing(SingleBenchmarkResult::hasAnyFailure, Comparator.reverseOrder()) // Reverse
.thenComparing(SingleBenchmarkResult::getAverageScore, resilientScoreComparator)
.compare(a, b);
}
मुझे व्यक्ति की प्राकृतिक तुलना को लागू करने की आवश्यकता है, इसलिए मैं इन सुझाए गए परिवर्तनों को लागू नहीं कर सकता। क्या आपको लगता है कि Comparator.comparing (...) तुलनात्मक बिल्डर से भी धीमी है? –
यदि आप प्राकृतिक आदेश को लागू करते हैं, तो विधि 'तुलना (व्यक्ति, व्यक्ति)' की तुलना में 'तुलना (व्यक्ति)' की तुलना में की जानी चाहिए, इसलिए सवाल भ्रामक था। मुझे नहीं लगता कि 'Comparator.comparing' का उपयोग' तुलनात्मक बिल्डर 'से धीमा हो जाएगा, लेकिन फिर भी, आप मेरे उत्तर में दिखाए गए 'स्थिर अंतिम' फ़ील्ड को घोषित करके इसे सुधार सकते हैं और' तुलना करने के लिए (व्यक्ति) '' BY_NAME.compare (यह, अन्य) वापस करें; '। – Holger
अच्छा बिंदु। असल में मैंने उन मामलों का उपयोग किया है जहां यह प्राकृतिक आदेश है और मैंने उन मामलों का उपयोग किया है जहां यह एक पुन: प्रयोज्य कॉम्परेटर (ऊपर की तरह) है। मैं देखता हूं कि उस विशेष कॉम्परेटर को एक अलग वर्ग बनाने के लिए अब इसकी आवश्यकता क्यों नहीं है। –