当前位置:首页 > 图灵资讯 > 技术篇> 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

组合

函数拼接

上一篇 我的面向对象程序观
下一篇 Java流式编程

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题