一、收集器Collector
//T:表示流中每个元素的类型。 A:表示中间结果容器的类型。 R:表示最终返回的结果类型。
public interface Collector<T, A, R> {Supplier<A> supplier()//生成容器BiConsumer<A,T>  accumulator()//是添加元素BinaryOperator<A> combiner()//是合并容器Function<A,R>finisher()///是输出的结果Set<Collector.Characteristics> characteristics()//返回Set的Collector.Characteristics指示此收集器的特征。//返回一个新的Collector由给定的描述supplier, accumulator,combiner,和finisher功能。static <T,A,R> Collector<T,A,R> of(Supplier<A> supplier, BiConsumer<A,T> accumulator, BinaryOperator<A> combiner, Function<A,R> finisher, Collector.Characteristics... characteristics)//返回一个新的Collector由给定的描述supplier, accumulator和combiner功能。static <T,R> Collector<T,R,R>  of(Supplier<R> supplier, BiConsumer<R,T> accumulator, BinaryOperator<R> combiner, Collector.Characteristics... characteristics)}
二、收集器工厂Collectors

public final class Collectors extends Object

Collectors作为Stream的collect方法的参数,Collector是一个接口,它是一个可变的汇聚操作,将输入元素累计到一个可变的结果容器中;它会在所有元素都处理完毕后,将累积的结果转换为一个最终的表示(这是一个可选操作);

Collectors本身提供了关于Collector的常见汇聚实现,Collectors的内部类CollectorImpl实现了Collector接口,Collectors本身实际上是一个
工厂。

2.1 变成ConcurrentMap
//返回将Collector元素累积到其中 ConcurrentMap的并发函数,其键和值是将提供的映射函数应用于输入元素的结果。
static <T,K,U> Collector<T,?,ConcurrentMap<K,U>>  toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)//返回将Collector元素累积到其中 ConcurrentMap的并发函数,其键和值是将提供的映射函数应用于输入元素的结果。
static <T,K,U> Collector<T,?,ConcurrentMap<K,U>>  toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)//返回将Collector元素累积到其中 ConcurrentMap的并发函数,其键和值是将提供的映射函数应用于输入元素的结果。
static <T,K,U,M extends ConcurrentMap<K,U>> Collector<T,?,M>    toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
2.2 变成Map
static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)//1、当key重复时,会抛出异常:java.lang.IllegalStateException: Duplicate key
//2、当value为null时,会抛出异常:java.lang.NullPointerException

案例

List<Person>integerList=newArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("f",2));
Mapmap=integerList.stream().collect(Collectors.toMap(Person::getName,Person::getAge));
System.out.println(map);//{a=3, b=3, c=3, d=2, e=2, f=2}
//第三个参数用在key值冲突的情况下:如果新元素产生的key在Map中已经出现过了,第三个参数就会定义解决的办法。
static <T,K,U> Collector<T,?,Map<K,U>> toMap(  Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("e",3));Collections.sort(integerList,comparator);
System.out.println(integerList);*/
Map map =integerList.stream().collect(Collectors.toMap(Person::getName,Person::getAge,(a,b)->a+b));
System.out.println(map);//{a=3, b=3, c=3, d=2, e=5}
//返回将Collector元素累积到 Map其键中的值,其值是将提供的映射函数应用于输入元素的结果。
static <T,K,U,M extends Map<K,U>> Collector<T,?,M>  toMap( Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
2.3 变成Collection
static <T> Collector<T,?,List<T>> toList()
static <T> Collector<T,?,Set<T>>  toSet()
//自定义
static <T,C extends Collection<T>>  Collector<T,?,C>  toCollection(Supplier<C> collectionFactory)

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("e",3));List<Integer> list= integerList.stream().map(Person::getAge).collect(Collectors.toList());
System.out.println(list);//[3, 3, 3, 2, 2, 3]
System.out.println(list.getClass());//class java.util.ArrayListSet<Integer>set=integerList.stream().map(Person::getAge).collect(Collectors.toSet());
System.out.println(set);//[2, 3]
System.out.println(set.getClass());//class java.util.HashSetLinkedList<Integer>linkedList=integerList.stream().map(Person::getAge).collect(Collectors.toCollection(LinkedList::new));
System.out.println(linkedList);//[3, 3, 3, 2, 2, 3]
System.out.println(linkedList.getClass());//class java.util.LinkedList
2.4 变成String
static Collector<CharSequence,?,String>    joining()//delimiter分隔符连接
static Collector<CharSequence,?,String>   joining(CharSequence delimiter) //prefix前缀
//suffix后缀
static Collector<CharSequence,?,String>   joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

案例

List<Person> integerList = newArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("e",3));Stringlist = integerList.stream().map(Person::getName).collect(Collectors.joining());
System.out.println(list);//abcdeeStringset = integerList.stream().map(Person::getName).collect(Collectors.joining(","));
System.out.println(set);//a,b,c,d,e,eStringlinkedList = integerList.stream().map(Person::getName).collect(Collectors.joining(",","(",")"));
System.out.println(linkedList);//(a,b,c,d,e,e)
2.5 计算最值
static <T> Collector<T,?,Optional<T>>  maxBy(Comparator<? super T> comparator)static <T> Collector<T,?,Optional<T>>  minBy(Comparator<? super T> comparator)

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",2));
integerList.add(new Person("c",3));
integerList.add(new Person("d",4));
integerList.add(new Person("e",5));
integerList.add(new Person("e",6));Optional<Person> person = integerList.stream().collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
System.out.println(person.get());//Person{name='e',age='6'}
2.6 平均值
static <T> Collector<T,?,Double> averagingDouble(ToDoubleFunction<? super T> mapper)static <T> Collector<T,?,Double> averagingInt(ToIntFunction<? super T> mapper)static <T> Collector<T,?,Double> averagingLong(ToLongFunction<? super T> mapper)
案例
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",1));
integerList.add(new Person("c",1));
integerList.add(new Person("d",1));
integerList.add(new Person("e",1));
integerList.add(new Person("e",1));double number=integerList.stream().collect(Collectors.averagingDouble(Person::getAge));
System.out.println(number);//1.0
2.7 统计数据
static <T> Collector<T,?,DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper)static <T> Collector<T,?,IntSummaryStatistics>   summarizingInt(ToIntFunction<? super T> mapper) static <T> Collector<T,?,LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper)

DoubleSummaryStatistics,IntSummaryStatistics,LongSummaryStatistics 用于收集统计数据(如计数,最小值,最大值,总和和平均值)的状态对象。
此实现不是线程安全的。但是,Collectors.toXXXStatistics()在并行流上使用是安全的 ,因为并行实现Stream.collect() 提供了必要的分区,隔离和合并结果,以实现安全有效的并行执行。

他们的方法如下

void accept(int value)//添加一个值
void combine(IntSummaryStatistics other)//将另一个的状态合并IntSummaryStatistics到这个状态中。
double getAverage()//算术平均值,如果没有记录值,则返回零。
long getCount()//返回记录的值的计数。
int getMax()//返回记录的最大值,或者Integer.MIN_VALUE没有记录值。
int getMin()//返回记录的最小值,或者Integer.MAX_VALUE没有记录值。
long getSum()//返回记录的值的总和,如果没有记录值,则返回零。
String toString()//返回对象的字符串表示形式。

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",2));
integerList.add(new Person("c",3));
integerList.add(new Person("d",4));
integerList.add(new Person("e",5));
integerList.add(new Person("e",6));DoubleSummaryStatistics number = integerList.stream().collect(Collectors.summarizingDouble(Person::getAge));
System.out.println(number.getMax());//6
System.out.println(number.getMin());//1.0
System.out.println(number.getSum());//21.0
System.out.println(number.getAverage());//3.5
number.accept(100);
System.out.println(number.getMax());//100.0
2.8 求和
static <T> Collector<T,?,Double> summingDouble(ToDoubleFunction<? super T> mapper)
static <T> Collector<T,?,Integer> summingInt(ToIntFunction<? super T> mapper)
static <T> Collector<T,?,Long>  summingLong(ToLongFunction<? super T> mapper)
2.9 reducing函数
//op 缩减的函数
static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op)
//identity储存器初始值
static <T> Collector<T,?,T> reducing(T identity, BinaryOperator<T> op)
//mapper作用的数值
static <T,U> Collector<T,?,U>   reducing(U identity, Function<? super T,? extends U> mapper, BinaryOperator<U> op)

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",0));
integerList.add(new Person("c",0));
integerList.add(new Person("d",0));
integerList.add(new Person("e",0));
integerList.add(new Person("e",0));Integernumber = integerList.stream().collect(Collectors.reducing(1,Person::getAge,(a,b)->a+b));
System.out.println(number);//2
2.10 计数
//返回Collector类型的接受元素,T用于计算输入元素的数量。
static <T> Collector<T,?,Long>  counting()
2.11 分组-变成map
//classifier分组依据函数
static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("a",2));
integerList.add(new Person("a",3));
integerList.add(new Person("b",4));
integerList.add(new Person("b",5));
integerList.add(new Person("b",6));Map map =i ntegerList.stream().collect(Collectors.groupingBy(Person::getName));
System.out.println(map);
{a=[Person{name='a', age='1'}, Person{name='a', age='2'}, Person{name='a', age='3'}],
b=[Person{name='b', age='4'}, Person{name='b', age='5'}, Person{name='b', age='6'}]
}
//downstream将小组内对象进行处理
static <T,K,A,D> Collector<T,?,Map<K,D>>  groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)//mapFactory中间操作
static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M>  groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)

案例

List<Person> integerList = newArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("a",2));
integerList.add(new Person("a",3));
integerList.add(new Person("b",4));
integerList.add(new Person("b",5));
integerList.add(new Person("b",6));Map map= i ntegerList.stream().collect(Collectors.groupingBy(Person::getName,Collectors.reducing(0,Person::getAge,(a,b)->a+b)));System.out.println(map);//{a=6, b=15}Map map = integerList.stream().collect(Collectors.groupingBy(Person::getName,TreeMap::new,Collectors.reducing(0,Person::getAge,(a,b)->a+b)));System.out.println(map.getClass());//classjava.util.TreeMap
2.12 分组-变成ConcurrentMap
static <T,K> Collector<T,?,ConcurrentMap<K,List<T>>> groupingByConcurrent(Function<? super T,? extends K> classifier)static <T,K,A,D> Collector<T,?,ConcurrentMap<K,D>>  groupingByConcurrent(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)static <T,K,A,D,M extends ConcurrentMap<K,D>> Collector<T,?,M> groupingByConcurrent(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
2.13 分割流
//predicate分区的依据
static <T> Collector<T,?,Map<Boolean,List<T>>>   partitioningBy(Predicate<? super T> predicate)static <T,D,A> Collector<T,?,Map<Boolean,D>> partitioningBy(Predicate<? super T> predicate, Collector<? super T,A,D> downstream)
2.14 收集器
//通过在累积之前将映射函数应用于每个输入Collector元素,使类型的接受元素适应一个接受类型的U元素T。
static <T,U,A,R> Collector<T,?,R>   mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)

案例

List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("a",2));
integerList.add(new Person("a",3));
integerList.add(new Person("b",4));
integerList.add(new Person("b",5));
integerList.add(new Person("b",6));List list = integerList.stream().collect(Collectors.mapping(Person::getName,Collectors.toList()));System.out.println(list);//[a, a, a, b, b, b]
2.15 收集之后继续做一些处理
static <T,A,R,RR> Collector<T,A,RR>  collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)

java收集器Collector相关推荐

  1. java中collector使用_Java8中重要的收集器collector

    Collector介绍 Java8的stream api能很方便我们对数据进行统计分类等工作,函数式编程的风格让我们方便并且直观地编写统计代码. 例如: Stream stream = Stream. ...

  2. 矩阵累积相乘 java_累积:轻松自定义Java收集器

    矩阵累积相乘 java Accumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java ...

  3. 累积:轻松自定义Java收集器

    Accumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java Collector更加容 ...

  4. Java8中重要的收集器Collector

    Collector介绍 Java8的stream api能很方便我们对数据进行统计分类等工作,函数式编程的风格让我们方便并且直观地编写统计代码. 例如: Stream<Integer> s ...

  5. Java8 Stream 自定义收集器Collector

    在之前的例子中,我们都是使用Collectors的静态方法提供的CollectorImpl,为接口Collector<T, A, R>的一个实现类,为了自定义我们自己的Collector, ...

  6. java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...

  7. java 根据类名示例化类_Java收集器类– 18个示例

    java 根据类名示例化类 Java Collectors is a utility class that provides many useful implementations of the Co ...

  8. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...

  9. java stream Interface Collector<T,A,R>

    Interface Collector<T,A,R> T:输入的类型 A:中间存放数据的容器 R:输出的类型 Collector通过下面四个方法协同工作以完成汇聚操作: supplier: ...

最新文章

  1. 计算机导论简答芯片,吉大计算机 - 计算机导论简答题 (2011级)
  2. Shell脚本头定义
  3. python笔记: 生成器
  4. OpenStack 存储服务 Cinder存储节点部署LVM (十四)
  5. leetcode初级算法4.两个数组的交集 II
  6. 回溯应用-- 0-1背包问题
  7. 数论 —— 欧拉函数
  8. python输入三个整数_python笔记3:依次输入3个数排序打
  9. 物联网时代下,如何打造智慧新社区?
  10. 编程语言python入门-手把手教你从零开始用Python语言写爬虫程序
  11. spring cloud gateway java.lang.IllegalStateException:Only one connection receive subscriber allowed.
  12. ssl教程易语言代码
  13. MySQL8.0 安装教程-Windows64位
  14. 当了一次微软产品的讲师
  15. Python之美—技术细节篇
  16. 为Onda v820w CH (v1) DualOS平板刷写Remix单系统
  17. 解决xshell SSH 连接远程ubuntu make menuconfig 退格键无法删除问题
  18. 如何给自己的公司做一个网站
  19. MySQL查看表结构SQL语句
  20. Unity帧同步和状态同步

热门文章

  1. 接近8000字的Spring/Spring常用注解总结|安排|
  2. matlab legend函数 用法
  3. Android视频播放器开发—— 探究MediaPlayer
  4. 【难受坏了】Win11, 快连APP断网(Win11,lets威屁N)
  5. C和CPP的区别 C++,Java and Python的区别
  6. ChatGPT“横扫”校园缘何遭封杀
  7. 利用excel更换证件照背景色
  8. Google authenticator 谷歌身份验证,实现动态口令
  9. 趣好玩开发日志 03-day
  10. SqlDataAdapter与SqlCommand之间的区别