Một bộ sưu tập có thể được sử dụng cho việc này.
- Đối với hai loại, sử dụng
Collectors.partitioningBy()
nhà máy.
Điều này sẽ tạo một Map
từ Boolean
đến List
và đặt các mục vào một hoặc danh sách khác dựa trên a Predicate
.
Lưu ý: Vì luồng cần được tiêu thụ toàn bộ, nên luồng này không thể hoạt động trên các luồng vô hạn. Và bởi vì luồng được tiêu thụ bằng mọi giá, phương thức này chỉ đơn giản là đặt chúng vào Danh sách thay vì tạo luồng mới với bộ nhớ. Bạn luôn có thể truyền phát các danh sách đó nếu bạn yêu cầu các luồng làm đầu ra.
Ngoài ra, không cần trình lặp, thậm chí không có trong ví dụ chỉ dành cho người đứng đầu mà bạn cung cấp.
- Tách nhị phân trông như thế này:
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());
- Đối với nhiều loại, sử dụng một
Collectors.groupingBy()
nhà máy.
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());
Trong trường hợp các luồng không phải Stream
, nhưng một trong những luồng nguyên thủy như thế IntStream
, thì .collect(Collectors)
phương thức này không có sẵn. Bạn sẽ phải làm theo cách thủ công mà không cần nhà máy thu gom. Đó là cách thực hiện như thế này:
[Ví dụ 2.0 kể từ 2020-04-16]
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 ));
});
Trong ví dụ này, tôi khởi tạo ArrayLists với kích thước đầy đủ của bộ sưu tập ban đầu (nếu điều này được biết hoàn toàn). Điều này ngăn việc thay đổi kích thước các sự kiện ngay cả trong trường hợp xấu nhất, nhưng có khả năng ngấu nghiến không gian 2 * N * T (N = số phần tử ban đầu, T = số luồng). Để đánh đổi không gian cho tốc độ, bạn có thể loại bỏ nó hoặc sử dụng dự đoán có giáo dục tốt nhất của bạn, như số phần tử cao nhất dự kiến trong một phân vùng (thường chỉ hơn N / 2 cho một phân chia cân bằng).
Tôi hy vọng tôi không xúc phạm bất cứ ai bằng cách sử dụng phương thức Java 9. Đối với phiên bản Java 8, hãy xem lịch sử chỉnh sửa.
Stream
thành nhiềuStream
s mà không cần chuyển đổi trung gian , mặc dù tôi nghĩ rằng những người đạt được câu hỏi này thực sự đang tìm cách để đạt được điều đó bất kể ràng buộc đó là câu trả lời của Mark. Điều này có thể do thực tế là câu hỏi trong tiêu đề không giống như trong mô tả .