2017-12-16 110 views
6

java.util.stream.Stream इंटरफ़ेस में sorted विधि के दो संस्करण हैं - sorted() जो प्राकृतिक क्रम में तत्वों को प्रतिस्थापित करता है और sorted(Comparator)min() विधि Stream इंटरफ़ेस पर क्यों लागू नहीं की गई थी, जो प्राकृतिक क्रम के दृष्टिकोण से न्यूनतम तत्व लौटाएगी?जावा 8 स्ट्रीम इंटरफ़ेस में न्यूनतम() नो-पैरामीटर संस्करण क्यों नहीं है?

+0

जवाब पहले ही दिया सहायक होते हैं, लेकिन काफी मुख्य बात करने के लिए नहीं मिलता है। तो, 'क्रमबद्ध' विधि के 2 संस्करण हैं- 'क्रमबद्ध() 'और' क्रमबद्ध (तुलनात्मक)'। ऐसा लगता है कि मुझे थोड़ा असंगत लगता है कि 'min()' 'min (comparator) 'के साथ एक साथ पेश नहीं किया गया था जब' sorted' के संबंधित संस्करण हैं। कुछ कारण होना चाहिए। – PresentProgrammer

+0

'Stream.sorted()' एक गलती थी। केवल 'Stream.sorted (तुलनात्मक) 'होना चाहिए। – ZhekaKozlov

+0

@ZhekaKozlov मैं इतना भी सोचा, लेकिन मैं नहीं कर सकते इस – Eugene

उत्तर

3

मुझे लगता है कि न्यूनतम() केवल हस्ताक्षर की अनुमति देता है जो एक तुलनाकर्ता को स्वीकार करता है क्योंकि स्ट्रीम किसी भी प्रकार का हो सकता है, यहां तक ​​कि आपके द्वारा बनाए गए एक प्रकार भी। ऐसे मामले में प्राकृतिक आदेश पर भरोसा करना असंभव होगा, जैसा कि आपने बनाया है, आपके द्वारा निर्दिष्ट किए जाने तक प्राकृतिक आदेश नहीं हो सकता है।

यदि आप क्लास स्ट्रीम का उपयोग करते हैं, तो इंटस्ट्रीम, आप देखेंगे कि कोई तर्क() विधि बिना तर्क के परिभाषित है। यह वही करता है जो आप चाहते हैं। यह निम्नलिखित है:

public static void main (String... args){ 
     IntStream s=IntStream.of(1,2,3,4,5,6,7,8,9,10); 
     System.out.println(s.min().getAsInt()); 
    } 
+1

हमम ... अच्छा बिंदु, लेकिन 'सॉर्टेड()' तत्वों को 'तुलनात्मक' लागू करने के लिए भी आवश्यक है लेकिन यह अभी भी इंटरफेस में पेश किया गया है। – PresentProgrammer

+0

मैं आपको सुनता हूं। मैं इस बात के बारे में भी उत्सुक होना शुरू कर रहा हूं। यह पता लगाने के लिए एक और सुराग, शायद, यह है कि क्रमबद्ध एक मध्यवर्ती ऑपरेशन है, जबकि न्यूनतम/अधिकतम नहीं हैं। लेकिन मैं वास्तव में यह नहीं सोच सकता कि यह – BabaNew

3

Comparator.naturalOrder इस उद्देश्य को पूरा करता है। इसका अस्तित्व (या इसके कस्टम कार्यान्वयन) अन्य वर्गों को सरल बना देता है क्योंकि उन्हें तुलनात्मक क्षेत्रों में शून्य-मानों के लिए विशेष कोडपैथ लागू करने की आवश्यकता नहीं है।

इसका प्रकार तुलनात्मक रूप से लागू करने के लिए स्ट्रीम के टी को भी मजबूर करेगा।

+0

हां कैसे मदद कर सकता है हां, 'तुलनात्मक। प्राकृतिक ऑर्डर()' बिना किसी संदेह के इस मामले में मदद करता है, लेकिन फिर भी यह सवाल का जवाब नहीं देता है (मुख्य प्रश्न पर टिप्पणी देखें)। – PresentProgrammer

3

मुझे लगता है कि केवल एपीआई को प्रदूषित करेगा। कोई कह सकता है कि "कोई अधिकतम पैरामीटर रहित संस्करण क्यों नहीं है", "कोई CharStream क्यों नहीं है" और यह उपलब्ध कराई जा सकने वाली चीज़ों के संदर्भ में और चालू हो सकता था लेकिन सर्वोत्तम नहीं था।

इस पर विधि मिनट एक parameterless होने:

someList.stream().min(Comparator.naturalOrder()); 

अलग नहीं होगा।

इसलिए एपीआई को सभी संभावित चीजों के साथ प्रदूषित करने के बजाय पुन: प्रयोज्य विधि बनाने के लिए सबसे अच्छा है।

+1

संभावित प्रदूषण एक अच्छा बिंदु है, लेकिन फिर पैरामीटर-कम 'क्रमबद्ध() 'पेश नहीं किया गया था। – PresentProgrammer

3

यह स्पष्ट किया जाना चाहिए कि min, max, और sorted, Stream के लिए एक विधि है, जो एक तुलनित्र की आवश्यकता नहीं है जोड़ने के लिए, सामान्य प्रकार सुरक्षा ढीला करने के लिए एक तरह से परिचय जावा भाषा के वर्तमान संस्करण के रूप में नहीं है विशिष्ट पैरामीटरेशन के उदाहरणों को प्रतिबंधित करने के तरीकों का समर्थन करें, यानी तुलनीय तत्वों की धाराओं तक सीमित करें।

तो प्रश्न दूसरे तरीके से हो सकता है, sorted() के साथ प्रकार सुरक्षा की इस संभावित ब्रेक को क्यों अनुमति दी गई है?

मैं डेवलपर्स दिमाग में नहीं देख सकता, लेकिन एक दिलचस्प बिंदु यह है कि सॉर्टिंग का विशेष रूप से लंबे समय से इलाज किया गया है। जेनेरिकों के परिचय के साथ, Comparator के बिना उस सॉर्टिंग को लागू करने की संभावना आई थी, केवल तुलनीय तत्वों के साथ संग्रह या सरणी के लिए प्रयास किया जा सकता है। हालांकि, विशेष रूप से जेनेरिक संग्रह को लागू करते समय, डेवलपर्स को इस तथ्य का सामना करना पड़ सकता है कि सरणी सामान्य तत्व प्रकार के साथ नहीं बनाई जा सकती हैं। अन्य परिदृश्य हो सकते हैं, जहां एक डेवलपर एक सरणी या औपचारिक रूप से गैर तुलनीय प्रकार का संग्रह करता है जबकि निहित तत्व निश्चित रूप से तुलनीय होते हैं। जैसा कि कहा गया है, मैं डेवलपर्स दिमाग में कहने के लिए नहीं देख सकता, किस परिदृश्य पर विचार किया गया था।

लेकिन

  • Arrays.sort(Object[]) सरणी प्रकार लागू नहीं करता है Comparable की एक उप-प्रकार किया जाना है। यहां तक ​​कि अगर ऐसा हुआ,
  • sort(T[] a, Comparator<? super T> c) निर्दिष्ट करता है कि एक null तुलनित्र का तात्पर्य "प्राकृतिक व्यवस्था" है, जो किसी भी प्रकार
  • Collections.sort(List<T> list) के लिए प्राकृतिक आदेश का अनुरोध की अनुमति देता है एक तुलनीय तत्व प्रकार, लेकिन
  • Collections.sort(List<T> list, Comparator<? super T> c) फिर से है कि एक null निर्दिष्ट करता है की आवश्यकता है तुलनित्र का मतलब है "प्राकृतिक आदेश", इसलिए टाइप सिस्टम को कमजोर करने का अभी भी एक आसान तरीका है। चूंकि "null का अर्थ है प्राकृतिक" नियम was already specified before Generics existed, इसे संगतता के लिए रखा जाना था।

लेकिन यह केवल पीछे की संगतता के बारे में नहीं है। List.sort(Comparator), जावा 8 में शुरू की, भी, "प्राकृतिक व्यवस्था" के लिए तर्क के रूप में स्वीकार करने null के रूप में निर्दिष्ट किया जाता है तो अब हम एक और परिदृश्य, एक implementer एक संकलन समय प्रकार तुलनीय तत्वों गारंटी देता है कि बिना डेटा को सॉर्ट करना पड़ सकता है जहां की है।

इसलिए, जब छँटाई करने के लिए आता है, वहाँ पहले से ही चकमा करने के लिए अवसरों प्रकार प्रणाली के बहुत सारे हैं। लेकिन Stream.sorted(Comparator) एकमात्र प्रकार की विधि है जो null तुलनित्र को स्वीकार नहीं करती है। तो Comparator.naturalOrder() निर्दिष्ट किए बिना प्राकृतिक आदेश द्वारा छंटनी केवल तर्क के बिना sorted() का उपयोग करना संभव है। वैसे, एक null तुलनित्र के साथ एक पहले से ही हल कर इनपुट होने और तुलनित्र के बिना sorted() का अनुरोध केवल उसी परिस्थिति स्ट्रीम कार्यान्वयन कि छंटाई की पहचान करेगा आवश्यक नहीं है, यानी यह तुलनाकारक तुलना नहीं है और Comparator.naturalOrder() जांच नहीं की जाती है।

आम तौर पर, तुलनाकारक के प्रकार के सुरक्षा आश्चर्यजनक कमजोर है। जैसे Collections.reverseOrder() मनमाना प्रकार के तुलनित्र को लौटाता है, इस प्रकार की तुलना तुलनीय होने की मांग नहीं करता है। तो min() के बजाय, आप स्ट्रीम के औपचारिक प्रकार के बावजूद न्यूनतम अनुरोध करने के लिए max(Collections.reverseOrder()) का उपयोग कर सकते हैं। या मनमाना प्रकार के लिए Comparator.naturalOrder() के बराबर प्राप्त करने के लिए Collections.reverseOrder(Collections.reverseOrder()) का उपयोग करें। इसी प्रकार, Collator किसी भी कारण से Comparator<Object> लागू करता है, इसके बावजूद यह केवल String एस की तुलना कर सकता है।

+0

'तुलनीय तत्वों की धाराओं को सीमित करने' के लिए आपका क्या मतलब है? यह कहने का एक तरीका है कि जब तक कोई प्रकार 'टी तुलनात्मक नहीं है ...', तो आपके पास दृश्यता (पहुंच) की विधि 'अधिकतम' नहीं हो सकती है? – Eugene

+1

@ यूजीन: हाँ, यह कहने का एक काल्पनिक तरीका है कि "इस विधि को केवल तभी लागू किया जा सकता है, यदि लक्ष्य 'स्ट्रीम <टी को तुलनात्मक >' "तक असाइन किया जा सके। पहले से ही एक वाक्यविन्यास है जो 'इस प्रकार के प्रकार में एनोटेशन जोड़ने की अनुमति देता है, इसलिए सिंटैक्स पक्ष पर, परिवर्तन इतना बड़ा नहीं होगा। लेकिन अर्थात्, यह एक बड़ा कदम होगा। – Holger

संबंधित मुद्दे