मैं थोड़ा विस्तार करने के लिए क्या 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
है: ऐसा कोई अनुकूलन नहीं किया जाता है, भले ही इसे रोकना न पड़े।
नहीं, मैंने पूरे स्निपेट दिया। हो सकता है कि मेरे पास पुस्तक का पुराना संस्करण हो। –
तीसरा उदाहरण (दूसरा स्निपेट), क्या jdk9 इसका ख्याल नहीं रखता है ?? –