jdk提供了Collector接口。
public class MySetCollector<T> implements Collector<T,Set<T>,Set<T>> { @Override public Supplier<Set<T>> supplier() { //用于提供一个空的容器 System.out.println("supplier invoked! "); return HashSet::new; // 不接受对象,返回一个Set对象 } @Override public BiConsumer<Set<T>, T> accumulator() { // 累加器类型. 接收两个参数不返回值. //完成的功能: 不断的往set中添加元素 System.out.println("accumulator invoked! "); return Set<T>::add ; // return HashSet<T>::add ; 返回HashSet报错. 原因: 返回的是中间类型的返回类型. 不论返回什么类型的Set ,Set都符合要求. } @Override public BinaryOperator<Set<T>> combiner() { //将并行流的多个结果给合并起来. System.out.println("combiner invoked! "); return (set1,set2)->{ set1.addAll(set2); return set1; }; } @Override public Function<Set<T>, Set<T>> finisher() { //完成器,把所有的结果都合并在一起. 返回一个最终的结果类型 //如果中间类型 和最终结果类型一致, 不执行此方法; System.out.println("finisher invoked! "); // return t -> t ; return Function.identity(); // 总是返回参数. } @Override public Set<Characteristics> characteristics() { System.out.println("characterstics invoked! "); return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH,Characteristics.UNORDERED)); // 这个地方 不给参数,IDENTITY_FINISH . 则会调用finisher() } public static void main(String[] args) { List<String> list = Arrays.asList("hello", "world"); Set<String> collect = list.stream().collect(new MySetCollector<>()); System.out.println(collect); } 输出结果为: supplier invoked! accumulator invoked! combiner invoked! characterstics invoked! characterstics invoked! [world, hello] }2020你还不会Java8新特性? (13)
内容版权声明:除非注明,否则皆为本站原创文章。