जावा 8 स्ट्रीम और सरणियों पर संचालन


197

मैंने अभी नई जावा 8 स्ट्रीम क्षमताओं की खोज की है। पायथन से आ रहा है, मैं सोच रहा था कि क्या अब एक समरूप जैसे सरणियों पर संचालन करने का एक साफ तरीका था, दो सरणियों को "एक पंक्ति पायथोनिक" तरीके से गुणा करना?

धन्यवाद

जवाबों:


294

java.util.Arraysकिसी सरणी को जावा 8 स्ट्रीम में परिवर्तित करने के लिए नई विधियाँ जोड़ी गई हैं जिनका उपयोग तब किया जा सकता है आदि।

int sum =  Arrays.stream(myIntArray)
                 .sum();

दो सरणियों को गुणा करना थोड़ा अधिक कठिन है क्योंकि मैं स्ट्रीम ऑपरेशन के रूप में एक ही समय में मूल्य और सूचकांक प्राप्त करने का तरीका नहीं सोच सकता। इसका मतलब है कि आपको संभवतः सरणी के अनुक्रमित पर स्ट्रीम करना होगा।

//in this example a[] and b[] are same length
int[] a = ...
int[] b = ...

int[] result = new int[a.length];

IntStream.range(0, a.length)
         .forEach(i -> result[i] = a[i] * b[i]);

संपादित करें

टिप्पणी करने वाले @Holger बताते हैं कि आप इस तरह के mapबजाय विधि का उपयोग कर सकते हैं forEach:

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();

13
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();
होल्गर

2
@ होल्गर हाँ जो भी काम करेगा। हालांकि आप शायद mapToIntमुक्केबाजी से बचने के लिए उपयोग करना चाहते हैं ।
dkatzel

जिप के सिमुलेशन के लिए यह अंतिम मात्रा है जहां आपको परिणाम के लिए भंडारण का प्रचार करना होगा। मुझे आश्चर्य है कि स्ट्रीम लाइब्रेरी में कोई ज़िप क्यों नहीं है?
रेब.कबिन

इस एसओ जवाब के अनुसार , एक ज़िप जावा 8 के पुराने बीटा में था, फिर बाहर निकाल दिया गया। सौभाग्य से पोस्टर में स्रोत था और यह उत्तर में है। मैंने कई बार कोड का उपयोग किया है और यह बहुत अच्छा काम करता है।
स्पार्क_स्प्रेड

@dkatzel - चूंकि यह पहले से ही एक IntStream है, इसलिए "Map" एक IntUnaryOperator लेता है, इसलिए इसमें कोई बॉक्सिंग शामिल नहीं है।
एम। जस्टिन

58

आप किसी सरणी को उपयोग करके स्ट्रीम में बदल सकते हैं Arrays.stream():

int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);

एक बार जब आप अपनी स्ट्रीम प्राप्त कर लेते हैं, तो आप प्रलेखन में वर्णित किसी भी पद्धति का उपयोग कर सकते हैं , जैसे sum()या जो भी। आप कर सकते हैं mapया filterएक लैम्ब्डा समारोह के साथ प्रासंगिक धारा तरीकों को फोन करके अजगर की तरह:

Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);

एक बार जब आप अपनी स्ट्रीम को संशोधित कर लेते हैं, तो आप toArray()इसे कहीं और उपयोग करने के लिए इसे एक सरणी में बदलने के लिए कॉल करते हैं:

int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();

9

अगर आपको बड़ी संख्या से निपटना है तो सावधान रहें।

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0

उपरोक्त योग नहीं है 2 * Integer.MIN_VALUE। आपको इस मामले में ऐसा करने की आवश्यकता है।

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct

3

कृपया ध्यान दें कि Arrays.stream (गिरफ्तारी) स्ट्रीम के बजाय एक LongStream (या IntStream, ...) बनाते हैं ताकि प्रकार को संशोधित करने के लिए मानचित्र फ़ंक्शन का उपयोग नहीं किया जा सके। यही कारण है कि .mapToLong, mapToObject, ... फ़ंक्शंस प्रदान किए जाते हैं।

कैंट-आई-मैप-पूर्णांक-से-स्ट्रिंग्स-जब-स्ट्रीमिंग-ए-ए-सरणी पर एक नज़र डालें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.