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);
相关文章
|
17天前
|
安全 Java API
JDK 11中的动态类文件常量:探索Java字节码的灵活性与动态性
在JDK 11中,Java语言引入了一个新的特性,允许在运行时动态地修改类文件常量。这一特性为Java开发者提供了更大的灵活性,使他们能够根据需要在运行时更改类文件中的常量值。本文将深入探讨动态类文件常量的工作原理、优点、限制以及在实际项目中的应用。
60 11
|
17天前
|
Java
Integer类【JDK源码分析】
Integer类【JDK源码分析】
25 0
|
17天前
|
安全 Java API
14.JDK底层Unsafe类是个啥东西?
14.JDK底层Unsafe类是个啥东西?
63 0
14.JDK底层Unsafe类是个啥东西?
|
9月前
|
Java
Java之JDK8时间相关类的详细解析
Java之JDK8时间相关类的详细解析
58 0
|
17天前
|
安全 Java 开发者
jdk1.8 Optional类从入门到实战
Optional 类是 Java 8 引入的一个容器类,用于表示一个值存在或不存在。其在 java.util 包中,主要目的是为了解决 Java 程序中广泛存在的空指针异常(NullPointerException)问题,同时提供了一种更优雅的方式来处理可能为 null 的对象。 在 Java 8 之前,处理 null 值往往依赖于显式的 null 检查,这种方式不仅增加了代码的复杂度,而且容易出错。Optional 类提供了一种更好的解决方案,通过封装可能为 null 的值,强制开发者显式地处理值存在或不存在的情况,从而减少在运行时出现 NullPointerException 的可能性。
28 3
|
17天前
|
安全 Java 开发者
JDK 9:不可变集合类工厂方法的探索与实践
JDK 9引入了一系列新的不可变集合类工厂方法,这些方法为Java开发者提供了更加便捷和安全的方式来创建不可变集合。本文将深入探讨这些新方法的原理、优势以及如何在实际开发中应用它们。
|
10月前
|
Java API 索引
LinkedList类【JDK源码分析】
LinkedList类【JDK源码分析】
38 0
|
10月前
|
算法 搜索推荐 Java
Arrays类【JDK源码分析】
Arrays类【JDK源码分析】
34 0
|
10月前
|
安全 Java API
AbstractStringBuilder类【JDK源码分析】
AbstractStringBuilder类【JDK源码分析】
66 0
|
10月前
|
安全 Java API
StringBuilder类【JDK源码分析】
StringBuilder类【JDK源码分析】
66 0