इसके लिए एक कलेक्टर का उपयोग किया जा सकता है।
- दो श्रेणियों के लिए,
Collectors.partitioningBy()
कारखाने का उपयोग करें ।
यह एक बनाएगा Map
से Boolean
करने के लिए List
, और या एक में आइटम एक के आधार पर अन्य सूची में डाल दिया Predicate
।
नोट: चूँकि धारा को पूरी खपत करने की आवश्यकता होती है, इसलिए यह अनंत धाराओं पर काम नहीं कर सकता है। और क्योंकि धारा का वैसे भी उपभोग किया जाता है, यह विधि बस उन्हें एक नई धारा के साथ स्मृति बनाने के बजाय सूचियों में डालती है। आप उन सूचियों को हमेशा स्ट्रीम कर सकते हैं यदि आपको आउटपुट के रूप में स्ट्रीम की आवश्यकता है।
इसके अलावा, पुनरावृत्ति की कोई ज़रूरत नहीं है, यहां तक कि केवल आपके द्वारा प्रदान किए गए प्रमुख उदाहरण में भी नहीं।
- बाइनरी विभाजन इस तरह दिखता है:
Random r = new Random();
Map<Boolean, List<String>> groups = stream
.collect(Collectors.partitioningBy(x -> r.nextBoolean()));
System.out.println(groups.get(false).size());
System.out.println(groups.get(true).size());
- अधिक श्रेणियों के लिए, एक
Collectors.groupingBy()
कारखाने का उपयोग करें ।
Map<Object, List<String>> groups = stream
.collect(Collectors.groupingBy(x -> r.nextInt(3)));
System.out.println(groups.get(0).size());
System.out.println(groups.get(1).size());
System.out.println(groups.get(2).size());
यदि धाराएँ नहीं हैं Stream
, लेकिन आदिम धाराओं में से एक जैसी हैं IntStream
, तो यह .collect(Collectors)
विधि उपलब्ध नहीं है। आपको इसे बिना कलेक्टर कारखाने के मैनुअल तरीके से करना होगा। यह कार्यान्वयन इस तरह दिखता है:
[उदाहरण २०२०-०४-१६ से २.०]
IntStream intStream = IntStream.iterate(0, i -> i + 1).limit(100000).parallel();
IntPredicate predicate = ignored -> r.nextBoolean();
Map<Boolean, List<Integer>> groups = intStream.collect(
() -> Map.of(false, new ArrayList<>(100000),
true , new ArrayList<>(100000)),
(map, value) -> map.get(predicate.test(value)).add(value),
(map1, map2) -> {
map1.get(false).addAll(map2.get(false));
map1.get(true ).addAll(map2.get(true ));
});
इस उदाहरण में मैं प्रारंभिक संग्रह के पूर्ण आकार के साथ एरेलेलिस्ट्स को इनिशियलाइज़ करता हूं (यदि यह सभी ज्ञात है)। यह सबसे खराब स्थिति में भी आकार बदलने की घटनाओं को रोकता है, लेकिन संभावित रूप से 2 * N * T स्पेस (N = तत्वों की प्रारंभिक संख्या, T = थ्रेड की संख्या) को टटोल सकता है। गति के लिए स्पेस-ऑफ करने के लिए, आप इसे छोड़ सकते हैं या अपने सबसे अच्छे शिक्षित अनुमान का उपयोग कर सकते हैं, जैसे कि एक विभाजन में तत्वों की अपेक्षित उच्चतम संख्या (आमतौर पर संतुलित विभाजन के लिए एन / 2 से अधिक)।
मुझे आशा है कि मैं जावा 9 विधि का उपयोग करके किसी को नाराज नहीं करता। जावा 8 संस्करण के लिए, संपादन इतिहास को देखें।
Stream
कईStream
एस में बदलने की संभावना पर ध्यान केंद्रित किया गया है , हालांकि मुझे लगता है कि जो लोग इस सवाल पर पहुंचे हैं, वे वास्तव में इस तरह की बाधा की परवाह किए बिना हासिल करने का रास्ता देख रहे हैं, जो मार्क का जवाब है। यह इस तथ्य के कारण हो सकता है कि शीर्षक में प्रश्न विवरण में ऐसा नहीं है ।