2017-06-11 6 views
13

धारा संचालन, करते समय मध्यवर्ती/pipleline संचालन स्ट्रीम में विभिन्न विशेषताओं (जैसे हल/आकार/अलग/आदेश दिया) के साथ बनाया जा जाएगा दौरान - मास्टरिंग lambdas (Ch 6)जावा -8 में स्ट्रीम विशेषताओं को सही तरीके से कैसे ढूंढें?

Stream.of(8,3,5,6,7,4)//ORDERED, SIZED 
.filer(i->i%2==0) // ORDERED 
.sorted() // ORDERED, SORTED 
.distinct() // DISTINCT, ORDERED, SORTED 
.map(i->i+1) // ORDERED 
.unordered(); //none 

कैसे कर हम पता लगाना उपरोक्त स्निपेट में उल्लिखित धारा की विभिन्न विशेषताओं?

उत्तर

8

मैं थोड़ा विस्तार करने के लिए क्या assylias कहा (जो बिल्कुल सही है) चाहते हैं।

पहले, इन विशेषताओं को सादे int के रूप में कार्यान्वित किया गया है, यह बाइनरी प्रतिनिधित्व है। सबसे पहले यह सभी शून्य है, लेकिन जब आप एक निश्चित विशेषता जोड़ते हैं तो यह one पर OR ऑपरेशन के माध्यम से सेट किया गया है, AND ऑपरेशन के माध्यम से हटा दिया गया है।

आप देख सकते हैं, जहां एक निश्चित Spliterator संपत्ति उदाहरण के लिए ऐसा करके अपने one सेट बस:

System.out.println(Integer.toBinaryString(Spliterator.SIZED)); // 1000000 

यह सही से एक में 7 वें बिट सेट करते हैं। तो जब आप की जाँच करें:

Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator(); 
System.out.println((spliterator.characteristics() & Spliterator.SIZED) == Spliterator.SIZED); 

आप वास्तव में अगर यह विशेष बिट सेट किया गया है की जाँच कर रहे हैं।

दूसरा

धारा विशेषताओं अपनी पहली धारा रचना (और नहीं दो) के परिणाम के रूप में सेट किए हैं। या तो किताब थोड़ा पुराना है या आप हमें पूरे उदाहरण से पता चला नहीं किया है:

Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator(); 

System.out.println(Integer.bitCount(spliterator.characteristics())); // 4 
System.out.println(Integer.toBinaryString(spliterator.characteristics()));// 100010001010000 

ये सेट बिट्स (कि one के बराबर हैं) SIZED, ORDERED, IMMUTABLE, SUBSIZED के अनुरूप हैं।

जो कुछ आपने दिखाया है वे स्पष्ट रूप से थोड़ा दूर हैं - आप स्वयं को जांच सकते हैं।

तीसरा

इन विशेषताओं स्ट्रीम प्रसंस्करण में अत्यंत महत्वपूर्ण हैं।कुछ उदाहरण:

long howMany = Stream.of(1, 2, 3).map(x -> { 
     System.out.println("mapping"); 
     return x * 2; 
    }).count(); 
    System.out.println(howMany); // 3 

जावा-9 में क्योंकि आप धारा (आप साफ़ नहीं की है SIZED विशेषता) नहीं बदला है आप, नहीं देखेंगे mapping मुद्रित; इस प्रकार मैपिंग का भी मूल्यांकन करने की आवश्यकता नहीं है।

Stream<Integer> unlimited = Stream.iterate(0, x -> x + 1); 
System.out.println(unlimited.spliterator().hasCharacteristics(Spliterator.SIZED)); 
Stream<Integer> limited = unlimited.limit(3);   
System.out.println(limited.spliterator().hasCharacteristics(Spliterator.SIZED)); 

आपको लगता है कि होता है कि उत्पादन false true होना चाहिए - हम सब के बाद एक limit, लेकिन कोई जोड़ रहे हैं; नतीजा false false है: ऐसा कोई अनुकूलन नहीं किया जाता है, भले ही इसे रोकना न पड़े।

+0

नहीं, मैंने पूरे स्निपेट दिया। हो सकता है कि मेरे पास पुस्तक का पुराना संस्करण हो। –

+0

तीसरा उदाहरण (दूसरा स्निपेट), क्या jdk9 इसका ख्याल नहीं रखता है ?? –

9

प्रत्येक में मंच आप कॉल कर सकते हैं:

int c = stream.spliterator().characteristics(); 

और फिर स्थिरांक Spliterator वर्ग में परिभाषित के खिलाफ परिणाम का परीक्षण करें। उदाहरण देखने के लिए के लिए यदि धारा का आदेश दिया जाता है:

boolean isOrdered = (c & Spliterator.ORDERED) == Spliterator.ORDERED; 

वैकल्पिक रूप से आप उपयोग कर सकते हैं:

boolean isOrdered = stream.spliterator().hasCharacteristics(Spliterator.ORDERED); 
+0

आप यह नहीं कर सकते * * प्रत्येक चरण * पर, स्ट्रीम का उपभोग किया जाएगा ... – Eugene

+3

@ यूजीन: आप स्प्लिटरेटर से स्ट्रीम को फिर से बना सकते हैं, [यहां देखें] (https://stackoverflow.com/a/28475289/2711488), मुझे लगता है, ओपी के बाद यही है ... – Holger

+2

@ होल्गर आह! जो उस स्प्लिटरेटर से एक स्ट्रीम वापस करने के लिए समझ में आता है ... thx। 100k पर ईमानदार बधाई। – Eugene

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