जैसा कि दूसरों ने पहले ही उल्लेख किया है, इसके पीछे डिजाइन का निर्णय तरीकों और कक्षाओं के विस्फोट को रोकने के लिए था।
फिर भी, व्यक्तिगत रूप से मुझे लगता है कि यह एक बहुत ही बुरा निर्णय था, और वहाँ, वे नहीं करना चाहते हैं CharStream
, जो उचित है, के बजाय विभिन्न तरीकों chars()
, मैं के बारे में सोचना होगा:
Stream<Character> chars()
, जो बक्से के पात्रों की एक धारा देता है, जिसमें कुछ प्रकाश प्रदर्शन जुर्माना होगा।
IntStream unboxedChars()
, जो प्रदर्शन कोड के लिए उपयोग किया जाएगा।
हालांकि , इस पर ध्यान केंद्रित करने के बजाय कि यह वर्तमान में इस तरह क्यों किया गया है, मुझे लगता है कि इस उत्तर को एपीआई के साथ ऐसा करने का तरीका दिखाने पर ध्यान केंद्रित करना चाहिए जिसे हमने जावा 8 के साथ प्राप्त किया है।
जावा 7 में मैंने इसे इस तरह किया होगा:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
और मुझे लगता है कि यह जावा 8 में करने के लिए एक उचित तरीका निम्नलिखित है:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
यहां मैं IntStream
एक वस्तु प्राप्त करता हूं और इसे लंबोदा के माध्यम से किसी ऑब्जेक्ट पर मैप करता हूं i -> (char)i
, यह स्वचालित रूप से इसे एक बॉक्स में रखेगा Stream<Character>
, और फिर हम वह कर सकते हैं जो हम चाहते हैं, और अभी भी प्लस के रूप में विधि संदर्भ का उपयोग करते हैं।
इस बात से अवगत रहें कि आपको क्या करना चाहिएmapToObj
, अगर आप भूल जाते हैं और उपयोग करते हैं map
, तो कुछ भी शिकायत नहीं करेगा, लेकिन आप अभी भी एक के साथ समाप्त IntStream
हो जाएंगे, और आपको यह सोचकर छोड़ दिया जा सकता है कि यह वर्णों का प्रतिनिधित्व करने वाले तार के बजाय पूर्णांक मानों को क्यों प्रिंट करता है।
जावा 8 के लिए अन्य बदसूरत विकल्प:
एक शेष में IntStream
और उन्हें अंततः मुद्रित करना चाहते हैं, आप मुद्रण के लिए अब विधि संदर्भों का उपयोग नहीं कर सकते हैं:
hello.chars()
.forEach(i -> System.out.println((char)i));
इसके अलावा, अपनी खुद की विधि के लिए विधि संदर्भ का उपयोग अब और काम नहीं करता है! निम्नलिखित को धयान मे रखते हुए:
private void print(char c) {
System.out.println(c);
}
और फिर
hello.chars()
.forEach(this::print);
यह एक संकलित त्रुटि देगा, क्योंकि संभवतः एक हानिपूर्ण रूपांतरण है।
निष्कर्ष:
एपीआई क्योंकि जोड़ने के लिए इच्छुक नहीं की इस तरह से डिजाइन किया गया था CharStream
, मैं व्यक्तिगत रूप से लगता है कि विधि एक लौटना चाहिए Stream<Character>
, और वैकल्पिक हल वर्तमान में उपयोग करने के लिए है mapToObj(i -> (char)i)
एक पर IntStream
उन लोगों के साथ ठीक से काम करने में सक्षम हो।
CharStream
मौजूद नहीं है, तो इसे जोड़ने में क्या समस्या होगी?