2015-01-07 5 views
11

जावा 8 में java.util.stream.Stream और java.util.stream.IntStream प्रकार हैं। java.util.Arrays, एक विधिएक बाइट सरणी को इंटस्ट्रीम में बदलने का सबसे अच्छा तरीका क्या है?

IntStream is = Arrays.stream(int[]) 

लेकिन ऐसी कोई विधि एक बाइट [] से एक IntStream बनाने के लिए है कम [] या चार [], किसी पूर्णांक पर प्रत्येक तत्व को चौड़ा। क्या बाइट [] से इंटस्ट्रीम बनाने के लिए कोई बेवकूफ/पसंदीदा तरीका है, इसलिए मैं बाइट एरे पर एक कार्यात्मक तरीके से काम कर सकता हूं?

मैं निश्चित रूप से तुच्छता बाइट [] [] int करने के लिए मैन्युअल रूप से और प्रयोग Arrays.stream (int []), या का उपयोग IntStream.Builder परिवर्तित कर सकते हैं:

public static IntStream stream(byte[] bytes) { 
    IntStream.Builder isb = IntStream.builder(); 
    for (byte b: bytes) 
     isb.add((int) b); 
    return isb.build(); 
} 

लेकिन न तो की वजह से बहुत कार्यात्मक है स्रोत की प्रतिलिपि।

एक इनपुटस्ट्रीम (या इस मामले में एक बाइटएरे इनपुट इनपुट) को इंटस्ट्रीम में परिवर्तित करने का एक आसान तरीका प्रतीत नहीं होता है, जो कार्यात्मक रूप से इनपुटस्ट्रीम को प्रोसेस करने के लिए बहुत उपयोगी होगा। (चमकती चमक?)

क्या कोई और अधिक कार्यात्मक तरीका है जो कुशल है और प्रतिलिपि नहीं करता है?

+0

हर 'byte' एक' int' विचार किया जाना चाहिए? या हर 4 बाइट्स को 'int' माना जाना चाहिए? –

+0

प्रत्येक बाइट एक int के लिए चौड़ा है। उदाहरण के लिए, मैं एक फ़ाइल या अन्य बाइट स्ट्रीम में सभी बाइट्स के हिस्टोरोग की गणना करना चाहता हूं। – djb

+0

स्ट्रीम एपीआई का उपयोग करके इनपुट इनपुट से बाइट्स क्यों पढ़ना चाहते हैं? इनपुटस्ट्रीम पढ़ता अनुक्रमिक है, पुरानी विधि का उपयोग करके पढ़ने के लिए यह बहुत तेज़ है, क्योंकि आप किसी भी तरह से व्यक्तिगत बाइट्स की ऑर्डर की गई धारा को समानांतर नहीं कर सकते हैं। आपको एक इनपुटस्ट्रीम के समांतर प्रसंस्करण * भाग * से बहुत लाभ हो सकता है ... –

उत्तर

17
byte[] bytes = {2, 6, -2, 1, 7}; 
IntStream is = IntStream.range(0, bytes.length).map(i -> bytes[i]); 

ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); 
IntStream is2 = IntStream.generate(inputStream::read).limit(inputStream.available()); 
+3

'जेनरेट' में 'सीमा' जोड़ें। अन्यथा यह एक अनंत 'स्ट्रीम' देता है। –

+0

@SotiriosDelimanolis धन्यवाद। संपादित करें। –

+0

मैं इसे बाइट [] से इंटस्ट्रीम भाग के उत्तर के रूप में वोट दे रहा हूं। हालांकि, जबकि inputStream.available() एक ByteArrayInputStream के लिए मान्य है, यह सभी इनपुटस्ट्रीम के लिए सटीक नहीं है, इसलिए स्ट्रीम को सीमित करने के लिए इसका उपयोग करने से आमतौर पर उपयोग की जाने वाली धाराओं को छोटा कर दिया जा सकता है। क्या इंटस्ट्रीम समस्या के लिए सामान्य इनपुटस्ट्रीम के लिए कोई और संकल्प है? – djb

9
public static IntStream stream(byte[] bytes) { 
    ByteBuffer buffer = ByteBuffer.wrap(bytes); 
    return IntStream.generate(buffer::get).limit(buffer.remaining()); 
} 

(यह आसानी से int को, ByteBuffer से int रों लेने के लिए बदला जा सकता है यानी। 4 बाइट।)

InputStream लिए, यदि आप यह उत्सुकता का उपभोग करना चाहते हैं, अभी-अभी पढ़ा यह byte[] में और उपरोक्त का उपयोग करें। यदि आप इसे आलसी रूप से उपभोग करना चाहते हैं, तो आप InputStream::readConsumer (प्लस अपवाद हैंडलिंग) के रूप में एक अनंत InputStream उत्पन्न कर सकते हैं और स्ट्रीम के अंत तक पहुंचने पर इसे समाप्त कर सकते हैं।

के संबंध में लेकिन न तो स्रोत

मैं नहीं दिख रहा है क्यों कि यह गैर कार्यात्मक बनाता है की नकल की वजह से बहुत कार्यात्मक है।

भी प्रासंगिक

+1

बोनस अंक के लिए, buffer.get(): 'IntStream.generate (buffer :: get) .limit (buffer.remaining) के लिए एक विधि संदर्भ का उपयोग करें।()) ' – prunge

+1

@prunge मैं इसके खिलाफ नहीं हूँ। –

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

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