এই জন্য একটি সংগ্রাহক ব্যবহার করা যেতে পারে।
- দুটি বিভাগের জন্য,
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)
পদ্ধতিটি উপলভ্য নয়। সংগ্রাহকের কারখানা ছাড়া আপনাকে এটি ম্যানুয়াল পদ্ধতিতে করতে হবে। এটি বাস্তবায়নের মতো দেখাচ্ছে:
[২০২০-০৪-১-16 সালের পরে 2.0 উদাহরণ]
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 * টি স্পেস (এন = প্রাথমিক উপাদানগুলির সংখ্যা, টি = থ্রেডের সংখ্যা) পেতে পারে। গতির জন্য স্থান বাণিজ্য করার জন্য, আপনি এটিকে ছেড়ে দিতে পারেন বা আপনার সেরা শিক্ষিত অনুমান ব্যবহার করতে পারেন, যেমন একটি পার্টিশনে প্রত্যাশিত সর্বোচ্চ সংখ্যক উপাদান (সাধারণত সুষম বিভাজনের জন্য N / 2 এর উপরে)।
আমি আশা করি জাভা 9 পদ্ধতি ব্যবহার করে আমি কাউকে আপত্তি করি না। জাভা 8 সংস্করণের জন্য, সম্পাদনা ইতিহাসটি দেখুন।
Stream
একাধিকStream
গুলি অন্তর্বর্তী রূপান্তর ছাড়া , যদিও আমি মনে করি যারা এই প্রশ্নের পৌঁছে আসলে এই ধরনের বাধ্যতা, যা মার্ক এর উত্তর হল তাই নির্বিশেষে অর্জন করা উপায় খুঁজছেন। এটি শিরোনামে প্রশ্নটি বর্ণনার মতো একই নয় বলে কারণে হতে পারে ।