如何解决收集器的Combine从未要求并行流
我正在尝试与以下代码并行运行收集器。从不调用“ combiner”方法,因此看起来收集器仍按顺序运行。为什么?如何使其平行?
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public class TestCollector {
private static class Staff {
private String staffFullName;
private int staffID;
public String getStaffFullName() {
return staffFullName;
}
public void setStaffFullName(String staffFullName) {
this.staffFullName = staffFullName;
}
public int getStaffID() {
return staffID;
}
public void setStaffID(int staffID) {
this.staffID = staffID;
}
}
private static class StaffCollector implements Collector<Staff,Queue<Staff>,Staff[]> {
@Override
public Supplier<Queue<Staff>> supplier() {
return ConcurrentLinkedQueue::new;
}
@Override
public BiConsumer<Queue<Staff>,Staff> accumulator() {
return (list,staff) -> list.add(staff);
}
@Override
public BinaryOperator<Queue<Staff>> combiner() {
return (left,right) -> {
System.out.print("combiner called");
left.addAll(right);
return left;
};
}
@Override
public Function<Queue<Staff>,Staff[]> finisher() {
return staffList -> {
System.out.println("Number of staff: " + staffList.size());
Staff[] staffArray = staffList.toArray(new Staff[0]);
return staffArray;
};
}
@Override
public Set<Characteristics> characteristics() {
return EnumSet.of(Characteristics.CONCURRENT,Collector.Characteristics.UNORDERED);
}
}
public static void main(String[] args) throws Exception {
ArrayList<Staff> staffList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Staff staff = new Staff();
staff.setStaffFullName("Staff " + i);
staff.setStaffID(i);
staffList.add(staff);
}
staffList.parallelStream().collect(new StaffCollector());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。