Jdk1.8 Collectors类使用详解

简介: Jdk1.8 Collectors类使用详解

Collectors类大家都并不陌生,从jdk1.8开始跟stream()流配合之后,写代码效率得到提升,源码里我们可以看到有很多的方法,比如groupingBy 和maxBy,这些都是干嘛的呢,这篇文章看完都能明白,以下代码简洁明了。


有3点需要注意:


1、Collectors.groupingBy强烈推荐,本人代码里使用最频繁的一个方法。

2、用Collectors.toMap方法,在使用的时候需要注意,把list里面的字段转成map的key和value,当key出现重复的时候会把错,若不想报异常,可以在方法后指定一个新值或者旧值,如何选择,看自己的业务场景决定。(下面第二个例子会有代码详解)

3、Collectors.joining方法可以转成字符串,可以指定分隔符号,和字符串前后都能加字符串(下面第五个例子会有代码详解)


1、用groupingBy转成map,本人代码里使用最频繁的一个方法:



 Map<Long, List<FavoriteGroup>> map = favoriteGroupList.stream().collect(
            Collectors.groupingBy(FavoriteGroup::getId));
        System.out.println(map);


2、吧list对象转成map,按标题和id分别为map的key和value。



Map<String, Long> map1 = favoriteGroupList.stream().collect(
            Collectors.toMap(FavoriteGroup::getTitle, FavoriteGroup::getId, (oldValue, newValue) -> newValue));
        System.out.println(map1);


3、summarizingLong方法很有意思,返回的是一个对象,里面有平均值,最大值,总和,最小值,长度,当然如果不需要那么多,也有单独求其中一个值的方法,下面都有详细介绍。



//最有意思的是这个方法,吧你需要的都可以封装在对象里返回,平均值,最大值,最小值,长度,总和,当然也可以用单独的方法求单独的值,下面也会单独演示一下
        LongSummaryStatistics statistics = favoriteGroupList.stream().map(FavoriteGroup::getId).collect(
            Collectors.summarizingLong(a -> a));
        log.info("平均值:{},最大值:{},最小值:{},总和:{},长度:{}", statistics.getAverage(), statistics.getMax(), statistics.getMin(),
            statistics.getSum(), statistics.getCount());
        //过滤掉空的 标题,并且求count
        Long count = favoriteGroupList.stream().filter(FavoriteGroup -> FavoriteGroup.getTitle() != null).collect(
            Collectors.counting());
        System.out.println(count);
        //maxBy是获取集合里面最大的 id,怎么用呢?minBy同理求最小的 id,下面演示最大id 如何求
        Optional<Long> maxId = favoriteGroupList.stream().map(FavoriteGroup::getId).collect(
            Collectors.maxBy(Long::compare));
        log.info("最大id:{}", maxId.get());
        //下面的方法是求和,
        Long sum = favoriteGroupList.stream().map(FavoriteGroup::getId).collect(
            Collectors.summingLong(a -> a));
        log.info("求和sum:{}", sum);


4、还可以放在concurrentMap中



 //放入concurrentHashMap的用法
        ConcurrentMap<Long, String> concurrentMap = favoriteGroupList.stream().collect(
            Collectors.toConcurrentMap(student -> student.getId(), student -> student.getTitle()));


5、joining方法的使用



//joining的用法,中间用逗号分割,前面加个start,后面加上end
        String newTitle = favoriteGroupList.stream().map(FavoriteGroup::getTitle).collect(
            Collectors.joining(",", "start", "end")).toString();


6、groupingBy还可以转成map



//groupingBy转成map
        Map<Long, Map<Long, String>> lopMap = favoriteGroupList.stream().collect(Collectors
            .groupingBy(FavoriteGroup::getId, Collectors.toMap(FavoriteGroup::getId, FavoriteGroup::getTitle)));
        log.info("longMapMap:{}", longMapMap);


7、partitioningBy可以按字段分组,并且可以判断条件,并对条件判断是否满足,返回true和false



//按title分组,在判断学生id是否大于200
        Map<String,Map<Boolean,List<FavoriteGroup>>> stringMapMap = favoriteGroupList.stream().collect(Collectors.groupingBy(FavoriteGroup::getTitle,
            Collectors.partitioningBy(favoriteGroup -> favoriteGroup.getId() > 200)));
        log.info("stringMapMap:{}",stringMapMap);
相关文章
|
7月前
|
安全 Java API
JDK 11中的动态类文件常量:探索Java字节码的灵活性与动态性
在JDK 11中,Java语言引入了一个新的特性,允许在运行时动态地修改类文件常量。这一特性为Java开发者提供了更大的灵活性,使他们能够根据需要在运行时更改类文件中的常量值。本文将深入探讨动态类文件常量的工作原理、优点、限制以及在实际项目中的应用。
162 11
|
7月前
|
安全 Java API
14.JDK底层Unsafe类是个啥东西?
14.JDK底层Unsafe类是个啥东西?
83 0
14.JDK底层Unsafe类是个啥东西?
|
7月前
|
Java
Integer类【JDK源码分析】
Integer类【JDK源码分析】
52 0
|
3月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
76 2
|
Java
Java之JDK8时间相关类的详细解析
Java之JDK8时间相关类的详细解析
82 0
|
3月前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
3月前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
4月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
4月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
4月前
|
Java 编译器 API
JDK版本特性问题之在 JDK 17 中,想声明一个密封类,如何解决
JDK版本特性问题之在 JDK 17 中,想声明一个密封类,如何解决