अधिकांश बाइट से संबंधित संचालन स्वचालित रूप से 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)
कलाकारों का उपयोग कर)
पहले एक वास्तव में है
- एक
IntStream
byte[]
से सरणी (ints बाइट्स चौड़ा)
- एक
IntStream
byte[]
को सरणी इकट्ठा बनाएँ: हम सिर्फ दो अतिरिक्त आपरेशन की जरूरत है आसान और इसे इस तरह कार्यान्वित किया जा सकता है: 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 का उपयोग करता है जब स्ट्रीम अनुक्रमिक होता है और लक्ष्य आकार अग्रिम में जाना जाता है।
स्रोत
2015-09-09 04:18:34
http://stackoverflow.com/questions/22918847/why-are-new-java-util-arrays-methods-in-java-8-not-overloaded-for-all-the-primit – assylias