मैंने अभी नई जावा 8 स्ट्रीम क्षमताओं की खोज की है। पायथन से आ रहा है, मैं सोच रहा था कि क्या अब एक समरूप जैसे सरणियों पर संचालन करने का एक साफ तरीका था, दो सरणियों को "एक पंक्ति पायथोनिक" तरीके से गुणा करना?
धन्यवाद
मैंने अभी नई जावा 8 स्ट्रीम क्षमताओं की खोज की है। पायथन से आ रहा है, मैं सोच रहा था कि क्या अब एक समरूप जैसे सरणियों पर संचालन करने का एक साफ तरीका था, दो सरणियों को "एक पंक्ति पायथोनिक" तरीके से गुणा करना?
धन्यवाद
जवाबों:
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();
mapToInt
मुक्केबाजी से बचने के लिए उपयोग करना चाहते हैं ।
आप किसी सरणी को उपयोग करके स्ट्रीम में बदल सकते हैं 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();
अगर आपको बड़ी संख्या से निपटना है तो सावधान रहें।
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
कृपया ध्यान दें कि Arrays.stream (गिरफ्तारी) स्ट्रीम के बजाय एक LongStream (या IntStream, ...) बनाते हैं ताकि प्रकार को संशोधित करने के लिए मानचित्र फ़ंक्शन का उपयोग नहीं किया जा सके। यही कारण है कि .mapToLong, mapToObject, ... फ़ंक्शंस प्रदान किए जाते हैं।
कैंट-आई-मैप-पूर्णांक-से-स्ट्रिंग्स-जब-स्ट्रीमिंग-ए-ए-सरणी पर एक नज़र डालें
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();