zoukankan      html  css  js  c++  java
  • 怎么在java中创建一个自定义的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提出来作为一个参数,由外部来定义。

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

        @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

    欢迎关注我的公众号:程序那些事,更多精彩等着您!
    更多内容请访问 www.flydean.com

  • 相关阅读:
    CREATE AGGREGATE
    技术文档列表
    jQuery 判断表单中多个 input text 中至少有一个不为空
    Java实现 蓝桥杯 算法提高 奥运会开幕式
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
  • 原文地址:https://www.cnblogs.com/flydean/p/java-custom-collector.html
Copyright © 2011-2022 走看看