देता है, लेकिन यह मुझे एक संकलक त्रुटि देता हैतुलना और thenComparing मैं नाम तो Java8 <code>Comparator</code> उपयोग करके आयु द्वारा कर्मचारियों की <code>List</code> सॉर्ट करने के लिए कोशिश कर रहा हूँ, मैं <code>Comparator</code> नीचे बनाया है संकलन त्रुटि
Type mismatch: cannot convert from Comparator<Object> to <unknown>
Comparator<String> c = Comparator.comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //compile error
लेकिन यह काम करता है अगर मैं स्पष्ट रूप से टाइप
निर्दिष्ट करता हूंया
Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
Comparator<String> age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
Comparator<String> cc = name.thenComparing(age); //works
मैं बाईं ओर प्रकार Comparator<String>
निर्दिष्ट किया है दो Compartor
रों बनाने और श्रृंखला लेकिन क्यों ऑटो प्रकार निष्कर्ष सही प्रकार नहीं मिल रहा है और स्पष्ट रूप से निर्दिष्ट करने की उम्मीद है।
क्या कोई इस पर स्पष्टीकरण दे सकता है?
यहाँ कोड
String[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" };
Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
List<String> sorted = Arrays.stream(arr).sorted(c).collect(Collectors.toList());
System.out.println(sorted);
उत्पादन
[alan 19, alan 25, mario 25, mario 30]
मैं सामान्य प्रकार निष्कर्ष पर एक विशेषज्ञ नहीं हूँ, लेकिन मेरा अनुमान है कि यह सिर्फ "बहुत ज्यादा ऑटो अनुमान है।" शायद, यह 'तुलना()' विधि के प्रकार को नहीं समझ सकता है क्योंकि इसमें किसी भी प्रकार का "एंकर" नहीं है, जो कि चेनिंग विधि के विपरीत है जहां आप स्पष्ट रूप से 'तुलना करने के परिणामस्वरूप एक प्रकार देते हैं () '। भले ही, मुझे लगता है कि यह आपके स्वयं के 'तुलनाकर्ता' लिखने के लिए और अधिक पठनीय होगा, और केवल एक बार 'स्प्लिट' कॉल करें। सबसे कम संभव लाइनों में कोड निचोड़ने के लिए कोई पुरस्कार नहीं है। – ajb
लक्षित टाइपिंग जंजीर विधि आमंत्रण के माध्यम से काम नहीं करती है, [यहां] देखें (http://stackoverflow.com/a/28834656/2711488) और [यहां] (http://stackoverflow.com/a/26883991/2711488) और [यहां] (http://stackoverflow.com/a/31383947/2711488)। हालांकि, आप बस अपने दो चरण तुलनित्र के बजाय 'Comparator.comparing (s -> s.replaceFirst ("\\ s +", "")) का उपयोग कर सकते हैं और परिणाम वही होगा ... – Holger
'Comparator.comparing ((स्ट्रिंग एस) -> s.split ("\\ s +") [0])। फिर कॉम्पैरिंगइन्ट (एस -> Integer.parseInt (एस।विभाजन ("\\ s +") [1])) 'काम करता है लेकिन यह' स्ट्रिंग 'क्यों आवश्यक है, यह' तुलनाकर्ता 'से अनुमान लगा सकता है, क्या यह प्रकार अनुमान में एक सीमा है? 'जावा संस्करण' का उपयोग कर बीटीडब्ल्यू 1.8.0_60 "' –
Saravana