程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Jdk1.8 Collectors类使用详解(实用干货)

发布于2021-06-12 14:03     阅读(483)     评论(0)     点赞(24)     收藏(2)


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

其中有两点需要注意:

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

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

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

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

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

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

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

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

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

4、还可以放在concurrentMap中

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

5、joining方法的使用

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

6、groupingBy还可以转成map

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

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

  1. //按title分组,在判断学生id是否大于200
  2. Map<String,Map<Boolean,List<FavoriteGroup>>> stringMapMap = favoriteGroupList.stream().collect(Collectors.groupingBy(FavoriteGroup::getTitle,
  3. Collectors.partitioningBy(favoriteGroup -> favoriteGroup.getId() > 200)));
  4. log.info("stringMapMap:{}",stringMapMap);

 

原文链接:https://blog.csdn.net/ke1ying/article/details/117714936



所属网站分类: 技术文章 > 博客

作者:飞翔公园

链接:http://www.javaheidong.com/blog/article/222382/f2511d52d5a170742693/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

24 0
收藏该文
已收藏

评论内容:(最多支持255个字符)