脚本宝典收集整理的这篇文章主要介绍了

java8-07-自定义Collector-ToList

脚本宝典小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望能帮助你少写一行代码,多一份安全和惬意。

[TOC]

声明

这一系列文章旨在帮助大家理解 Collector 的执行流程,至于实现的是否高效、是否优雅、是否合理等暂且不论。


现在来实现一个和 java.util.stream.Collectors#toList 一样效果的 ToListCollector

若对 Collector 的各个流程有疑问请移驾此处:http://blog.csdn.net/hylexus/...

简单实现

static class ToListCollector<T> implements Collector<T, List<T>, List<T>> {      @Override     public Supplier<List<T>> supplier() {         return () -> Lists.newArrayList();     }      @Override     public BiConsumer<List<T>, T> accumulator() {         return (list, e) -> list.add(e);     }      @Override     public BinaryOperator<List<T>> combiner() {         return (acc1, acc2) -> {             acc1.addAll(acc2);             return acc1;         };     }      @Override     public Function<List<T>, List<T>> finisher() {         return (acc) -> acc;     }      @Override     public Set<Characteristics> characteristics() {         Set<Characteristics> ret = new HashSet<>();         ret.add(Characteristics.CONCURRENT);         ret.add(Characteristics.IDENTITY_FINISH);         return Collections.unmodifiableSet(ret);     } }

简化代码

static class ToListCollector2<T> implements Collector<T, List<T>, List<T>> {      @Override     public Supplier<List<T>> supplier() {         return ArrayList::new;     }      @Override     public BiConsumer<List<T>, T> accumulator() {         return List::add;     }      @Override     public BinaryOperator<List<T>> combiner() {         return (acc1, acc2) -> {             acc1.addAll(acc2);             return acc1;         };     }      @Override     public Function<List<T>, List<T>> finisher() {         return Function.identity();     }      @Override     public Set<Characteristics> characteristics() {         return Collections.unmodifiableSet(                 EnumSet.of(                         Characteristics.CONCURRENT,                         Characteristics.IDENTITY_FINISH                 )         );     } }

使用自定义Collector

@Test public void testListCollector() {     List<Integer> list = IntStream.rangeClosed(1, 5).boxed()       .collect(new ToListCollector<>());     System.out.println(list);      List<Integer> list2 = Stream.iterate(1, i -> i + 1).limit(5)       .collect(new ToListCollector2<>());     System.out.println(list2); }

博客源码

https://github.com/hylexus/bl...

总结

以上是脚本宝典为你收集整理的

java8-07-自定义Collector-ToList

全部内容,希望文章能够帮你解决

java8-07-自定义Collector-ToList

所遇到的程序开发问题,欢迎加入QQ群277859234一起讨论学习。如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典网站推荐给程序员好友。 本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

80%的人都看过