返回顶部
首页 > 资讯 > 精选 >java收集器Collector怎么使用
  • 617
分享到

java收集器Collector怎么使用

2023-07-02 08:07:12 617人浏览 安东尼
摘要

本篇内容主要讲解“java收集器Collector怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java收集器Collector怎么使用”吧!一、收集器Collector//T:表示流中

本篇内容主要讲解“java收集器Collector怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java收集器Collector怎么使用”吧!

一、收集器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());//6System.out.println(number.getMin());//1.0System.out.println(number.getSum());//21.0System.out.println(number.getAverage());//3.5number.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]

15 收集之后继续做一些处理

static <T,A,R,RR> Collector<T,A,RR>    collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)

到此,相信大家对“java收集器Collector怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: java收集器Collector怎么使用

本文链接: https://www.lsjlt.com/news/340557.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java收集器Collector怎么使用
    本篇内容主要讲解“java收集器Collector怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java收集器Collector怎么使用”吧!一、收集器Collector//T:表示流中...
    99+
    2023-07-02
  • Java9中新增的Collector收集器怎么使用
    今天小编给大家分享一下Java9中新增的Collector收集器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:...
    99+
    2023-07-02
  • java收集器Collector案例汇总
    目录一、收集器Collector二、收集器工厂Collectors2.1 变成ConcurrentMap2.2 变成Map2.3 变成Collection2.4 变成String2....
    99+
    2024-04-02
  • Java9中新增的Collector收集器
    目录Filtering CollectorFlatMapping Collector结论前言: Java 8中添加了收集器Collectors,这有助于将输入元素累积到诸如Map、L...
    99+
    2024-04-02
  • java垃圾收集器有哪些及怎么使用
    这篇文章主要介绍“java垃圾收集器有哪些及怎么使用”,在日常操作中,相信很多人在java垃圾收集器有哪些及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java垃圾收集器有哪些及怎么使用”的疑惑有所...
    99+
    2023-07-02
  • java中GC算法和垃圾收集器怎么使用
    在Java中,GC(垃圾回收)算法和垃圾收集器是自动管理内存的关键组件。以下是关于如何使用GC算法和垃圾收集器的一些基本指南:1. ...
    99+
    2023-08-24
    java
  • Java中如何使用垃圾收集器
    Java中如何使用垃圾收集器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java垃圾收集器使用小诀窍,垃圾收集器(Garbage Collector,GC)是现代软件虚拟机技...
    99+
    2023-06-17
  • 怎么理解java的垃圾收集器
    本篇内容主要讲解“怎么理解java的垃圾收集器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解java的垃圾收集器”吧!初识引用对于刚接触 Java 的 C++ 程序员而言,理解栈和堆的关...
    99+
    2023-06-16
  • Java集合类怎么使用
    这篇文章主要讲解了“Java集合类怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合类怎么使用”吧!初始容量集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像...
    99+
    2023-06-02
  • 怎么查看JVM使用的默认的垃圾收集器
    本篇内容介绍了“怎么查看JVM使用的默认的垃圾收集器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查看JVM使用的默认的垃圾收集器查看步骤c...
    99+
    2023-06-25
  • java中的GC收集器详情
    目录1、GC(Garbage collection )2、GC算法2.1标记活动对象2.2 删除空闲对象2.3 标记清除(Mark-Sweep)2.4 清除压缩(Mark-Sweep...
    99+
    2024-04-02
  • java中map集合怎么使用
    在Java中,Map是一种键值对的集合,它提供了一种将键映射到值的方式。Map接口是Java集合框架中的一部分,它有多个实现类,例如...
    99+
    2023-10-08
    java
  • Java 流的高级使用之收集数据解析
    目录一、前言1.1 收集器1.2 预定义收集器Collectors类为我们提供的收集器,主要包含三大功能:二、深入2.1 规约和汇总统计元素数量查找流中的最大值和最小值汇总连接字符串...
    99+
    2024-04-02
  • Java 流处理之收集器详解
    Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇聚成一个最终结果。这个结果可以是一个对象,也可以是一个集合,甚至可以是一个基本类型数据。 以记录&nb...
    99+
    2024-04-02
  • PL/SQL怎么与Java集成使用
    在PL/SQL中与Java集成可以通过使用Java存储过程或函数来实现。以下是步骤: 创建Java类和方法:首先在Java中编写...
    99+
    2024-05-07
    PL/SQL Java
  • 怎么利用logstash收集springboot日志
    怎么利用logstash收集springboot日志?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。maven依赖<dependency> ...
    99+
    2023-06-14
  • Java8函数式编程之收集器怎么应用
    这篇文章主要介绍“Java8函数式编程之收集器怎么应用”,在日常操作中,相信很多人在Java8函数式编程之收集器怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8函数式编程之收集器怎么应用”的疑...
    99+
    2023-07-06
  • Java集合的Queue和LinkedList怎么使用
    这篇文章主要讲解了“Java集合的Queue和LinkedList怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合的Queue和LinkedList怎么使用”吧!Linke...
    99+
    2023-06-02
  • Java集合HashSet,TreeSet与LinkedHashSet怎么使用
    本篇内容介绍了“Java集合HashSet,TreeSet与LinkedHashSet怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-02
  • php怎么实现ip收集
    本文操作环境:Windows7系统,PHP7.1版,Dell G3电脑。php怎么实现ip收集php获取访问者IP地址汇总在很我的时候我们需要得到用户的真实IP地址,例如,日志记录,地理定位,将用户信息,网站数据分析等,其实获取IP地址很简...
    99+
    2016-09-16
    php ip
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作