2015-09-08 12 views
19

जावा 8 double, int और long के लिए Stream<T> विशेषज्ञताओं प्रदान करता है। हालांकि, मुझे the documentation में समकक्ष नहीं मिला।जावा 8 में, क्या बाइटस्ट्रीम क्लास है? <code>DoubleStream</code>, <code>IntStream</code> और <code>LongStream</code> क्रमश:

क्या जावा 8 ByteStream कक्षा प्रदान करता है?

+2

http://stackoverflow.com/questions/22918847/why-are-new-java-util-arrays-methods-in-java-8-not-overloaded-for-all-the-primit – assylias

उत्तर

23

नहीं, यह अस्तित्व में नहीं है। असल में, यह स्पष्ट रूप से कार्यान्वित नहीं किया गया था ताकि प्रत्येक आदिम प्रकार के लिए कक्षाओं के साथ स्ट्रीम एपीआई को अव्यवस्थित न किया जा सके।

OpenJDK मेलिंग सूची में ब्रायन गोएज़ से a mail का हवाला देते हुए:  

लघु जवाब: नहीं।

यह फॉर्म के लिए प्रत्येक जेडीके पदचिह्न के 100k + के लायक नहीं है जिसका उपयोग लगभग कभी नहीं किया जाता है। और अगर हमने उनको जोड़ा, तो मांग कम, फ्लोट, या बूलियन होगा।

एक और तरीका रखो, अगर लोगों ने जोर दिया कि हमारे पास सभी आदिम विशेषज्ञताएं हैं, तो हमारे पास कोई आदिम विशेषज्ञता नहीं होगी। कौन सा स्थिति से भी बदतर होगा।

+16

गंभीरता से? बाइट धाराओं का उपयोग "लगभग कभी नहीं" किया जाता है? मुझे आश्चर्य है कि वह लड़का किस लड़के पर रह रहा है, क्योंकि असली दुनिया में बाइट्स की धाराएं सर्वव्यापी हैं। – augurar

26

अधिकांश बाइट से संबंधित संचालन स्वचालित रूप से int में प्रचारित होते हैं। उदाहरण के लिए, (ByteStream के लिए संभावित उम्मीदवार) सरल विधि है जो byte[] लौटने नई byte[] सरणी सरणी के प्रत्येक तत्व के लिए एक byte निरंतर कहते हैं पर विचार करें:

public static byte[] add(byte[] arr, byte addend) { 
    byte[] result = new byte[arr.length]; 
    int i=0; 
    for(byte b : arr) { 
     result[i++] = (byte) (b+addend); 
    } 
    return result; 
} 

देखें, भले ही हम दो byte चर का एक अतिरिक्त प्रदर्शन, वे int तक बढ़ाए गए हैं और आपको परिणाम को byte पर डालना होगा। जावा बाइटकोड में byte-संबंधित परिचालन (सरणी लोड/स्टोर और बाइट को कास्ट को छोड़कर) को 32-बिट पूर्णांक निर्देशों (iadd, ixor, if_icmple और इसी तरह से) के साथ व्यक्त किया जाता है। इस प्रकार व्यावहारिक रूप से बाइट्स को IntStream के साथ स्याही के रूप में संसाधित करना ठीक है। ((byte) कलाकारों का उपयोग कर)

पहले एक वास्तव में है

  • एक IntStreambyte[] से सरणी (ints बाइट्स चौड़ा)
  • एक IntStreambyte[] को सरणी इकट्ठा बनाएँ: हम सिर्फ दो अतिरिक्त आपरेशन की जरूरत है आसान और इसे इस तरह कार्यान्वित किया जा सकता है:

    public static IntStream intStream(byte[] array) { 
        return IntStream.range(0, array.length).map(idx -> array[idx]); 
    } 
    

    एस o आप अपनी परियोजना में ऐसी स्थिर विधि जोड़ सकते हैं और खुश रह सकते हैं।

    byte[] सरणी में स्ट्रीम एकत्र करना अधिक मुश्किल है।मानक JDK वर्गों का उपयोग करना आसान समाधान ByteArrayOutputStream है:

    public static byte[] toByteArray(IntStream stream) { 
        return stream.collect(ByteArrayOutputStream::new, (baos, i) -> baos.write((byte) i), 
          (baos1, baos2) -> baos1.write(baos2.toByteArray(), 0, baos2.size())) 
          .toByteArray(); 
    } 
    

    हालांकि यह तुल्यकालन के कारण अनावश्यक भूमि के ऊपर है। आवंटन को कम करने और प्रतिलिपि बनाने के लिए ज्ञात लंबाई की धाराओं को विशेष रूप से संसाधित करना अच्छा होगा। फिर भी अब आप byte[] सरणियों के लिए स्ट्रीम एपीआई का उपयोग कर सकते हैं:

    public static byte[] addStream(byte[] arr, byte addend) { 
        return toByteArray(intStream(arr).map(b -> b+addend)); 
    } 
    

    मेरे StreamEx पुस्तकालय IntStreamEx वर्ग जो मानक IntStream बढ़ाता में इन आपरेशनों के दोनों है, तो आप इसे इस प्रकार का उपयोग कर सकते हैं:

    public static byte[] addStreamEx(byte[] arr, byte addend) { 
        return IntStreamEx.of(arr).map(b -> b+addend).toByteArray(); 
    } 
    

    आंतरिक रूप से toByteArray() विधि सरल आकार बदलने योग्य byte buffer और specially handles का उपयोग करता है जब स्ट्रीम अनुक्रमिक होता है और लक्ष्य आकार अग्रिम में जाना जाता है।

+0

'baos1.write (baos2.toByteArray(), 0, baos2.size()) 'एक अनावश्यक रूप से जटिल विलय है। सबसे पहले, 'toByteArray()' हमेशा एक उचित आकार का सरणी देता है, इसलिए ', 0, baos2.size() 'की आवश्यकता नहीं है। कारण, सरणी हमेशा उचित आकार में होती है, यह हमेशा एक नई आवंटित सरणी देता है। यदि आप इस ओवरहेड से बचना चाहते हैं, तो इसके बजाय 'baos2.writeTo (baos1) 'का उपयोग करने पर विचार करें, यह छोटा * और * अधिक कुशल है। – Holger

+0

वैसे, 'int' से' byte' तक कास्ट अनावश्यक है जब 'आउटपुटस्ट्रीम' में एकल 'बाइट' लिखना', इसलिए 'ByteArrayOutputStream :: write' संचयक कार्य के रूप में पर्याप्त है। – Holger

+0

@ होल्गर, दोनों 'लिखने के लिए' और 'लिखना (बाइट [])' ने 'IOException' फेंकने की घोषणा की, इसलिए आपको एक स्पष्ट प्रयास करने की आवश्यकता होगी। मैंने अभी सबसे छोटा संस्करण चुना है ('लिखना (बाइट [], int, int) 'फेंक नहीं - पागल, मुझे पता है)। वास्तव में अधिक लिखना 'लिखना' होगा। स्पष्ट कलाकार के रूप में, मुझे याद नहीं है। शायद मैंने फैसला किया कि ऐसा संस्करण अधिक स्पष्ट होगा। –

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