当前位置: 首页 > 图灵资讯 > 技术篇> JAVA Collector

JAVA Collector

来源:图灵教育
时间:2024-03-10 16:19:36

collector位于java.util.在stream下,根据javaDoc的描述:

A mutable reduction operation that accumulates input elements into a mutable result container, 
optionally transforming the accumulated result into a final representation after all input elements 
have been processed.  Reduction operations can be performed either sequentially or in parallel.

Collector是一种可变的聚集操作,按照指定的策略将输入的元素存储在可变容器中,待所有元素处理完成后,将结果转换为最终表示。例如,常用的Mapp最终表示、Set、List等等。

Collector接口定义

Collector是一个包含三个泛型和五个函数的接口定义:

public interface Collector<T, A, R> {
    Supplier<A> supplier();
    BiConsumer<A, T> accumulator();
    BinaryOperator<A> combiner();
    Function<A, R> finisher();
    Set<Characteristics> characteristics();
}
接口泛型

T是输入对象的类型,A是累加器的类型,R是最终收集的结果类型

接口函数

1. 建立累加器容器的supplier方法

 Supplier<A> supplier();

建立一个新的累加器容器。该方法定义了如何收集数据,必须返回一个无参数函数,用于为数据收集过程创建一个空的累加器实例。

示例:

@Override
public Supplier<List<T>> supplier() {
    return ArrayList::new;
}

2. 具体实现accumulator累加器累加的方法

BiConsumer<A, T> accumulator(); 

该方法将返回执行累加操作的函数,该函数有两个参数返回值为空,第一个参数为累加器容器,第二个参数为累加元素。

示例:

@Override
public BiConsumer<List<T>, T> accumulator() {
    return List::add;
}

3. 合并容器combiner方法

Collector支持并行,并行涉及任务分段和结果合并。

BinaryOperator<A> combiner();

将两个结果合并为一个,该方法返回一个供合并操作的函数。

示例:

@Override
public BinaryOperator<List<T>> combiner() {

    return (list1, list2) -> {
        list1.addAll(list2);
        return list1;
    };
}

4. 将结果finisher转换为结果finisher

Function<A, R> finisher();

在容器上执行最终转换,该方法返回一个转换函数,参数为累计值,返回值是最终转换返回的东西。

示例:

@Override
public Function<List<T>, List<T>> finisher() {
    return (i) -> i * i;
}

5. characteristics方法

Set<Characteristics> characteristics();

回到一个不可变的characteristics集合,它定义了收集器的行为,比如stream是否可以归还合同,可以使用哪些优化。

Characteristics是一个包含三个项目的枚举:

  1. UNORDERED--合同结果不受流中项目的遍历和累积顺序的影响
  2. CONCURRENT--Accumulator函数可以同时从多个线程调用,收集器可以并行归约流。如果收集器没有标记为UNORDERED, 只有在使用无序数据源时才能并行归约。
  3. IDENTITY_FINISH--这表明完成器方法返回的函数是一个可以跳过的恒等函数。在这种情况下,累加器对象将直接用作合同过程的最终结果。这意味着将累加器A转换为结果R是安全的。
二、Collector常用方法
// 类型归纳法
// 通过Stream.collect方法
Collector.toList();
Collector.toMap();
Collector.toSet();
Collector.toCollection();
Collector.toConcurrentMap();

// joining
// 将元素与某些规则联系起来
.stream().collect(Collectors.joining());

// collectingAndThen

// groupingBy

// partitioningBy

// counting

// maxBy/minBy

// summingInt/Double/Long

// summarizingInt/Double/Long

// mapping

// reducing

// 待更新

三、根据集合获取streamm

stream的常用方法:

  • 终结方法:返回值类型不再是stream接口本身的类型,如foreach、count等。
  • 非终结方法:返回值类型仍然是stream接口本身类型的方法,如filter、limit等。

方法名称

方法作用

方法种类

是否支持链式调用?

count

统计个数

终结方法

forEach

逐一处理

终结方法

filter

过滤

函数拼接

limit

取用前几个

函数拼接

skip

跳过前几个

函数拼接

map

映射

函数拼接

concat

组合

函数拼接