文章目录

  • 简介
  • Collector介绍
  • 自定义Collector
  • 总结


怎么在java中创建一个自定义的collector


简介

在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类。

今天我们介绍一下怎么自定义一个Collector。

Collector介绍

我们先看一下Collector的定义:

Collector接口需要实现supplier(),accumulator(),combiner(),finisher(),characteristics()这5个接口。

同时Collector也提供了两个静态of方法来方便我们创建一个Collector实例。

我们可以看到两个方法的参数跟Collector接口需要实现的接口是一一对应的。

下面分别解释一下这几个参数:

  • supplier

Supplier是一个函数,用来创建一个新的可变的集合。换句话说Supplier用来创建一个初始的集合。accumulator

  • accumulator

accumulator定义了累加器,用来将原始添加到集合中。

  • combiner

combiner用来将两个集合合并成一个。

  • finisher

finisher将集合转换为最终的集合类型。

  • characteristics

characteristics表示该集合的特征。这个不是必须的参数。

有了这几个参数,我们接下来看看怎么使用这些参数来构造一个自定义Collector。

自定义Collector

我们利用Collector的of方法来创建一个不变的Set:

    public static <T> Collector<T, Set<T>, Set<T>> toImmutableSet() {return Collector.of(HashSet::new, Set::add,(left, right) -> {left.addAll(right);return left;}, Collections::unmodifiableSet);}

上面的例子中,我们HashSet::new作为supplier,Set::add作为accumulator,自定义了一个方法作为combiner,最后使用Collections::unmodifiableSet将集合转换成不可变集合。

上面我们固定使用HashSet::new作为初始集合的生成方法,实际上,上面的方法可以更加通用:

    public static <T, A extends Set<T>> Collector<T, A, Set<T>> toImmutableSet(Supplier<A> supplier) {return Collector.of(supplier,Set::add, (left, right) -> {left.addAll(right);return left;}, Collections::unmodifiableSet);}

上面的方法,我们将supplier提出来作为一个参数,由外部来定义。

看下上面两个方法的测试:

    @Testpublic void toImmutableSetUsage(){Set<String> stringSet1=Stream.of("a","b","c","d").collect(ImmutableSetCollector.toImmutableSet());log.info("{}",stringSet1);Set<String> stringSet2=Stream.of("a","b","c","d").collect(ImmutableSetCollector.toImmutableSet(LinkedHashSet::new));log.info("{}",stringSet2);}

输出:

INFO com.flydean.ImmutableSetCollector - [a, b, c, d]INFO com.flydean.ImmutableSetCollector - [a, b, c, d]

总结

本文介绍了Collector和自定义Collector的实例,希望能对大家有所帮助。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/customCollector

©著作权归作者所有:来自51CTO博客作者ddean2009的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 为留言板添加字数实时统计与禁止超出功能; 2. 自选一些字符串和
  2. java 8 stream reduce详解和误区
  3. 留言板,字符串和数组方法 ----0407
  4. 统信UOS系统中设置WPS双面打印的方法
  5. 你应该知道的jvm知识-方法调用
  6. 初学Redis最清晰完整的教程
  7. IDEA快捷键总结大全
  8. 面向对象系列教材 (三)- Java类的方法
  9. 挑战10个最难回答的Java面试题

随机推荐

  1. PHP jpgraph库的配置及生成多种统计图表
  2. 详解PHP网页缓存技术优点及代码实例
  3. php之 Zend 内存管理器
  4. 速看!主流PHP框架性能非权威测试
  5. php如何进行内存调试
  6. 详解PHP中的OPcache 扩展
  7. PHP使用Closure创建匿名函数的方法介绍
  8. 如何兼容 MySQL + ES + MongoDB 实现上亿
  9. 谈谈PHP中的多进程消费队列
  10. 详解PHP论坛实现积分系统的思路代码