दिलचस्प पोस्ट
क्यों डबल है। MIN_VALUE ऋणात्मक नहीं है आईओएस में दृश्य पदानुक्रम का मैं कैसे निरीक्षण कर सकता हूं? ओरेकल में बहु-पंक्ति डालने का सबसे अच्छा तरीका है? पायथन में सूची में सूची की स्ट्रिंग का प्रतिनिधित्व करें NotificationCompat.Builder के साथ एक सूचना कैसे बनाऊं? एसक्यूएल सर्वर: खंड द्वारा कॉमा से अलग किए गए मान प्राप्त करने के लिए कास्ट या कन्वर्ट का उपयोग कब करें सी ++ में ऑब्जेक्ट का डायनामिक आरम्भिकरण क्या है? IOS में प्रमाणीकरण के लिए LDAP का उपयोग करना क्रिप्ट / ब्लॉफ़िश दो अलग-अलग नमक के साथ ही हैश क्यों बनाता है? जॉबलिब समानांतर एकाधिक सीपीयू की तुलना में धीमी है ऑब्जेक्ट्स की पहचान करना, आईडी (…) से लौटा मूल्य क्यों बदलता है? मैं जावा में कंप्यूटर की सीपीयू, मेमोरी, और डिस्क उपयोग की निगरानी कैसे करूं? सी / सी + + कंपाइलर के लिए सर्वश्रेष्ठ संकलक चेतावनी स्तर? टेम्पलेट पाठ में # {…} की अनुमति नहीं है

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 

Solutions Collecting From Web of "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()));