दिलचस्प पोस्ट
जब मेरी खोल स्क्रिप्ट निकल जाए तो मैं पृष्ठभूमि प्रक्रियाओं / नौकरियों को कैसे मारूं? त्रुटि – ट्रस्ट एन्कर्स पैरामीटर खाली नहीं होना चाहिए किसी ऑब्जेक्ट को एक बाइट में कनवर्ट करें फ्लोटिंग-प्वाइंट मान की सटीकता बनाए रखने के लिए Printf चौड़ाई निर्दिष्टकर्ता तेज सी या उद्देश्य-सी गणित पार्सर क्या है? अंतर (फ़ंक्शन () {}) (); और फ़ंक्शन () {} (); 'नया' कारण मेमोरी लीक का उपयोग क्यों करता है? क्यों "स्टार्टअप के रूप में सेट करें" विकल्प स्वयं फ़ाइल में संग्रहीत है और एसएलएन फाइल नहीं है? Java.time.clock.systemDefaultZone () के बीच कोई अंतर। GetZone () बनाम java.util.TimeZone.getDefault ()। ToZoneId ()? पिछली गिट का उपयोग करने वाली शाखा से शाखा कोणीय 2.0 राउटर ब्राउज़र को पुनः लोड करने पर काम नहीं कर रहा है स्ट्रिंग में किसी वर्ण की सभी घटनाओं को कैसे बदलना है? जावास्क्रिप्ट में सबसे तेज़ एमडी 5 का कार्यान्वयन ग्रहण में ग्रहण परियोजना को आयात करते समय सहकर्मी प्रमाणित नहीं होता सी ++ में, आभासी आधार वर्ग क्या है?

Comparator.reversed () लैम्ब्डा का उपयोग संकलन नहीं करता है

मेरे पास कुछ उपयोगकर्ता ऑब्जेक्ट्स के साथ एक सूची है और मैं सूची को सॉर्ट करने की कोशिश कर रहा हूं, लेकिन केवल लैम्ब्डा एक्सप्रेशन के साथ विधि संदर्भ का उपयोग कर काम करता है, कंपाइलर एक त्रुटि देता है:

List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName())); // works userList.sort(Comparator.comparing(User::getName).reversed()); // works userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error 

त्रुटि:

 com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol userList.sort(Comparator.comparing(u -> u.getName()).reversed()); ^ symbol: method getName() location: variable u of type Object 1 error 

वेब के समाधान से एकत्रित समाधान "Comparator.reversed () लैम्ब्डा का उपयोग संकलन नहीं करता है"

यह संकलक के प्रकार इनफ्रेंसिंग तंत्र में एक कमजोरी है लैम्ब्डा में u के प्रकार का अनुमान लगाने के लिए, लैम्ब्डा के लिए लक्ष्य प्रकार की स्थापना की आवश्यकता है। यह निम्नानुसार पूरा किया गया है userList.sort() प्रकार Comparator<User> की एक तर्क की उम्मीद कर रहा है पहली पंक्ति में, Comparator.comparing() को Comparator<User> वापस करने की आवश्यकता है इसका मतलब है कि Comparator.comparing() को Function आवश्यकता होती है जो User तर्क को लेती है। इस प्रकार पहली पंक्ति पर लैम्ब्डा में, u प्रकार का User होना चाहिए और सब कुछ काम करता है।

दूसरी और तीसरी लाइनों में, लक्ष्य टाइप करने के लिए कॉल की उपस्थिति से बाधित हो रहा reversed() मुझे पूरी तरह से यकीन नहीं है क्यों; दोनों रिसीवर और रिटर्न प्रकार के reversed() Comparator<T> ऐसा लगता है कि लक्षित प्रकार वापस रिसीवर को प्रचारित किया जाना चाहिए, लेकिन ऐसा नहीं है। (जैसे मैंने कहा, यह कमजोरी है।)

दूसरी पंक्ति में, विधि संदर्भ में अतिरिक्त प्रकार की जानकारी उपलब्ध है जो इस अंतर को भरती है। यह जानकारी तीसरी पंक्ति से अनुपस्थित है, इसलिए कंपाइलर आपको Object (आखिरी रिसोर्ट का अनुमान फॉलबैक) बताता है, जो असफल हो जाता है।

जाहिर है अगर आप किसी विधि संदर्भ का उपयोग कर सकते हैं, तो ऐसा करें और यह काम करेगा कभी-कभी आप एक विधि संदर्भ का उपयोग नहीं कर सकते, उदाहरण के लिए, अगर आप एक अतिरिक्त पैरामीटर देना चाहते हैं, तो आपको लैम्ब्डा अभिव्यक्ति का उपयोग करना होगा उस स्थिति में आप लैम्ब्डा में एक स्पष्ट पैरामीटर प्रकार प्रदान करेंगे:

 userList.sort(Comparator.comparing((User u) -> u.getName()).reversed()); 

भावी रिलीज में इस मामले को कवर करने के लिए कंपाइलर को बढ़ाया जाना संभव हो सकता है

आप द्वितीय तर्क के रूप में Comparator.reverseOrder() साथ दो तर्क तर्क Comparator.comparing का उपयोग करके इस सीमा के आसपास काम कर सकते हैं:

 users.sort(comparing(User::getName, reverseOrder()));