java收集器Collector案例汇总

目录
  • 一、收集器Collector
  • 二、收集器工厂Collectors
    • 2.1 变成ConcurrentMap
    • 2.2 变成Map
    • 2.3 变成Collection
    • 2.4 变成String
    • 2.5 计算最值
    • 2.6 平均值
    • 2.7 统计数据
    • 2.8 求和
    • 2.9 reducing函数
    • 2.10 计数
    • 2.11 分组-变成map
    • 2.12 分组-变成ConcurrentMap
    • 2.13 分割流
    • 2.14 收集器

一、收集器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.ArrayList
Set<Integer>set=integerList.stream().map(Person::getAge).collect(Collectors.toSet());
System.out.println(set);//[2, 3]
System.out.println(set.getClass());//class java.util.HashSet
LinkedList<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);//abcdee
Stringset = integerList.stream().map(Person::getName).collect(Collectors.joining(","));
System.out.println(set);//a,b,c,d,e,e
StringlinkedList = 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详情的文章就介绍到这了,更多相关java收集器 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java 8如何自定义收集器(collector)详解

    需求: 将 一个容器List<Bean> 按照一定的字段进行分组,分组过后的值为特定的BEAN 里面的属性例如: 假定有这样一个Bean public class SubjectOberser{ private String subjectKey; private AbstractObserver abstractObserver; ...geter seter 方法... } 我们需要按照 subjectKey 进行分组,分组过后的内容 应该为这样一个容器Map<String,List

  • Java8 Stream Collectors收集器使用方法解析

    Collectors.toMap: Student studentA = new Student("20190001","小明"); Student studentB = new Student("20190002","小红"); Student studentC = new Student("20190003","小丁"); //Function.identity() 获取这个对象本身

  • Java9中新增的Collector收集器

    目录 Filtering Collector FlatMapping Collector 结论 前言: Java 8中添加了收集器Collectors,这有助于将输入元素累积到诸如Map.List和Set等可变容器中. 在本文中,我们将探讨Java 9中添加的两个新收集器:Collectors.filtering 和 Collectors.flatMapping.flatMapping与收集器结合使用.通过提供智能元素集合进行分组. Filtering Collector Collectors.

  • java收集器Collector案例汇总

    目录 一.收集器Collector 二.收集器工厂Collectors 2.1 变成ConcurrentMap 2.2 变成Map 2.3 变成Collection 2.4 变成String 2.5 计算最值 2.6 平均值 2.7 统计数据 2.8 求和 2.9 reducing函数 2.10 计数 2.11 分组-变成map 2.12 分组-变成ConcurrentMap 2.13 分割流 2.14 收集器 一.收集器Collector //T:表示流中每个元素的类型. A:表示中间结果容器

  • Java 流处理之收集器详解

    目录 收集所有记录的 列1 值,以列表形式存储结果 收集所有记录的 列1 值,且去重,以集合形式存储 收集记录的 列2 值和 列3 值的对应关系,以字典形式存储 收集所有记录中 列3 值最大的记录 收集所有记录中 列3 值的总和 创建一个中间结果容器 逐一遍历流中的每个元素,处理完成之后,添加到中间结果 中间结果转换成最终结果 combiner()是做什么的? characteristics()是什么的? 完整代码 Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇

  • 一文详解Java中的Stream的汇总和分组操作

    目录 前言 一.查找流中的最大值和最小值 二.汇总 三.连接字符串 四.分组 1.分组 2.多级分组 3.按子组数据进行划分 后记 前言 在前面的文章中其实大家也已经看到我使用过collect(Collectors.toList()) 将数据最后汇总成一个 List 集合. 但其实还可以转换成Integer.Map.Set 集合等. 一.查找流中的最大值和最小值 static List<Student> students = new ArrayList<>(); ​ static

  • Java函数式编程(十):收集器

    前面我们已经用过几次collect()方法来将Stream返回的元素拼成ArrayList了.这是一个reduce操作,它对于将一个集合转化成另一种类型(通常是一个可变的集合)非常有用.collect()函数,如果和Collectors工具类里的一些方法结合起来使用的话,能提供极大的便利性,本节我们将会介绍到. 我们还是继续使用前面的Person列表作为例子,来看一下collect()方法到底有哪些能耐.假设我们要从原始列表中找出所有大于20岁的人.下面是使用了可变性和forEach()方法实现

  • JAVA 内存溢出案例汇总

    写在前面 作为程序员,多多少少都会遇到一些内存溢出的场景,如果你还没遇到,说明你工作的年限可能比较短,或者你根本就是个假程序员!哈哈,开个玩笑.今天,我们就以Java代码的方式来列举几个典型的内存溢出案例,希望大家在日常工作中,尽量避免写这些low水平的代码. 定义主类结构 首先,我们创建一个名称为BlowUpJVM的类,之后所有的案例实验都是基于这个类进行.如下所示. public class BlowUpJVM { } 栈深度溢出 public static void testStackOv

  • java中的GC收集器详情

    目录 1.GC(Garbage collection ) 2.GC算法 2.1标记活动对象 2.2 删除空闲对象 2.3 标记清除(Mark-Sweep) 2.4 清除压缩(Mark-Sweep-Compact) 2.5 标记和复制 3.JVM GC 3.1 JVM GC事件 3.2 Serial GC 3.3 Parallel GC 3.4 Concurrent Mark and Sweep 3.5 G1 –垃圾优先 4.总结 1.GC(Garbage collection ) 程序内存管理分

  • 浅谈JAVA8给我带了什么——流的概念和收集器

    到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是.可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合.这让笔者很难去理解他的定义.所以笔者不表态.各位同志自行理解吧. 在没有流以前,处理集合里面的数据一般都会用到显示的迭代器.用一下前面学生的例子吧.目标是获得学分大于5的前俩位同学. package com.aomi; import java.util.ArrayList; import java.util.Iterator; import j

  • Java之类加载机制案例讲解

    1.类加载 <1>.父子类执行的顺序 1.父类的静态变量和静态代码块(书写顺序) 2.子类的静态变量和静态代码块(书写顺序) 3.父类的实例代码块(书写顺序) 4.父类的成员变量和构造方法 5.子类的实例代码块 6.子类的成员变量和构造方法 <2>类加载的时机 如果类没有进行初始化,则需要先进行初始化,虚拟机规范则是严格规定有且只有5种情况必须先对类进行初始化(而加载,验证,准备要在这个之前开始) 1.创建类的实例(new的方式),访问某个类的静态变量,或者对该静态变量赋值,调用类

随机推荐