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

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

目录



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


简介


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


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


Collector介绍


我们先看一下Collector的定义:


image.png


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提出来作为一个参数,由外部来定义。


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


@Test
    public 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

相关文章
|
2天前
|
Java Spring 容器
【Java】Spring如何扫描自定义的注解?
【Java】Spring如何扫描自定义的注解?
41 0
|
2天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
32 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
2天前
|
Java
Java配置大揭秘:读取自定义配置文件的绝佳指南
Java配置大揭秘:读取自定义配置文件的绝佳指南
24 0
Java配置大揭秘:读取自定义配置文件的绝佳指南
|
2天前
|
NoSQL Java Redis
Java自定义线程池的使用
Java自定义线程池的使用
|
2天前
|
Java
java 自定义注解 实现限流
java 自定义注解 实现限流
18 1
|
2天前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
50 0
|
2天前
|
Java
[Java]自定义注解
[Java]自定义注解
47 0
|
2天前
|
Java Maven
java使用apache-commons-lang3生成随机字符串(可自定义规则、RandomUtils
java使用apache-commons-lang3生成随机字符串(可自定义规则、RandomUtils
|
2天前
|
Java
用java写一个自定义异常
用java写一个自定义异常
16 1
|
2天前
|
Java 编译器
【Java】异常操作及自定义异常
【Java】异常操作及自定义异常
33 2