ตัวสะสมสามารถใช้สำหรับสิ่งนี้
- สำหรับสองประเภทให้ใช้
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)
วิธีการจะไม่สามารถใช้ได้ คุณจะต้องทำด้วยตัวเองโดยไม่ต้องใช้โรงงานเก็บ การใช้งานมีลักษณะดังนี้:
[ตัวอย่าง 2.0 ตั้งแต่ 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 ));
});
ในตัวอย่างนี้ฉันเริ่มต้น ArrayLists ด้วยขนาดเต็มของคอลเลกชันเริ่มต้น (ถ้าเป็นที่รู้จักทั้งหมด) สิ่งนี้จะช่วยป้องกันเหตุการณ์การปรับขนาดแม้ในสถานการณ์ที่เลวร้ายที่สุด แต่อาจจะกินพื้นที่ 2 * N * T (N = จำนวนองค์ประกอบเริ่มต้น, T = จำนวนเธรด) ในการแลกเปลี่ยนพื้นที่เพื่อความเร็วคุณสามารถละทิ้งมันหรือใช้การเดาที่มีการศึกษาดีที่สุดของคุณเช่นจำนวนองค์ประกอบสูงสุดที่คาดไว้ในพาร์ติชันเดียว
ฉันหวังว่าฉันจะไม่รุกรานใครโดยใช้วิธีการของ Java 9 สำหรับเวอร์ชัน Java 8 ให้ดูที่ประวัติการแก้ไข
Stream
หลายStream
s โดยไม่ต้องแปลงกลางแต่ผมคิดว่าคนที่มาถึงคำถามนี้เป็นจริงหาวิธีการที่จะประสบความสำเร็จดังนั้นไม่คำนึงถึงข้อ จำกัด ดังกล่าวซึ่งเป็นคำตอบของมาร์ค ซึ่งอาจเกิดจากความจริงที่ว่าคำถามในชื่อเรื่องไม่เป็นเช่นเดียวกับที่ในคำอธิบาย