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

其中有两点需要注意:

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());//过滤掉空的 标题,并且求countLong 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,后面加上endString newTitle = favoriteGroupList.stream().map(FavoriteGroup::getTitle).collect(Collectors.joining(",", "start", "end")).toString();

6、groupingBy还可以转成map

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

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

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

8、去重

  static <T> Predicate<T> distinctByKey1(Function<? super T, ?> keyExtractor) {Map<Object, Boolean> seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}trackSubList = trackSubList.stream().filter(distinctByKey1(s -> s.getSubWaybillNo())).collect(Collectors.toList());
    public static <K> void addAll(Collection<K> list1, Collection<K> list2) {if(CollectionUtil.isEmpty(list2)){return;}list1.addAll(list2);}/*** o 集合 加入 collection* @param collection collection* @param o o* @param <T> T*/public static <T> void add(Collection<T> collection, T o) {if(Objects.isNull(o)){return;}collection.add(o);}/*** 通用list转Map* @param list list* @param keyMapper keyMapper* @param <K> K* @param <U> U* @return*/public static <K,U>  Map<U,K> toIdentityMap(Collection<K> list,Function<? super K, U> keyMapper) {return list.stream().filter(Objects::nonNull).collect(Collectors.toMap(keyMapper,Function.identity(),(oldV, newV)->newV));}

Jdk1.8 Collectors类使用详解(实用干货)相关推荐

  1. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  2. .net System.Web.Caching.Cache缓存类使用详解(转载)

    转自:http://www.cnblogs.com/virusswb/articles/1681561.html net System.Web.Caching.Cache缓存类使用详解 System. ...

  3. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  4. Java记录 -22- Java的基类Object详解

    Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. Oracle官方在线 Java API Specifications http://www.oracle.co ...

  5. C#中NameValueCollection类用法详解

    C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...

  6. pythonsvc_sklearn-SVC实现与类参数详解

    sklearn-SVC实现与类参数 它是基于libsvm实现的.随着样本数量的增加,拟合时间的复杂度要高于二次,这就使得当样板数量超过一万个时,很难扩展到数据集中. 在多类处理时,是按照1对1的方案进 ...

  7. laravel 如何 new php 类,PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解...

    <PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解>要点: 本文介绍了PHP实例:laravel通过创建自定义artisan make命令来新建类文件详 ...

  8. (117)System Verilog类继承详解

    (117)System Verilog类继承详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类继承详解 5)结语 1.2 FPGA ...

  9. (116)System Verilog类合成(类包含关系)详解

    (116)System Verilog类合成(类包含关系)详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类合成(类包含关系)详解 ...

最新文章

  1. 利用sort对多字段排序
  2. 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
  3. python include_tag_详解Python的Django框架中inclusion_tag的使用
  4. VS2010打不开创建的项目的解决方法
  5. python写快排_python 实现快速排序
  6. x86汇编-1(第一章—第二章)8086处理器基本情况
  7. EOJ_1024_表达式
  8. Spring学习笔记--导航
  9. 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则
  10. 引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
  11. [转]VS .NET 2005中水晶报表的打包部署
  12. npoi excel导入html数据库,C#_.NetFramework_Web项目_NPOI_EXCEL数据导入
  13. 传智播客 C/C++学习笔记 函数调用 模型
  14. 除了加速上币,OKEx在DeFi热潮中还能做什么?
  15. 童年记忆中做过的农活
  16. 闲鱼上卖什么东西一年赚了18万?
  17. 【Error】初始化ant design pro项目时遇到“pro 不是内部或外部命令”
  18. 基于python的手写数字识别实验报告_联机手写数字识别实验报告
  19. 弘泰俱乐部杨乐、车彦娇团队:凝聚慈善力量,关爱孤困儿童
  20. getMethod方法getMethod(String name, Class<?>... parameterTypes)传入可变参数类型

热门文章

  1. 百度CEO李彦宏在毕业二十周年之际受邀重回母校
  2. php有几个单词,PHP-如何选择一个句子的前10个单词?
  3. Macbook GlobalProtect 连接问题
  4. 如何让HTML页面支持部分内容打印
  5. D. Very Suspicious(数学 + 二分查找)
  6. 学习正则表达式的简单方法
  7. ng-zorro 升级后 nz-table 增删数据异常
  8. 电磁场的能量守恒和动量守恒
  9. list容器下的 emplace_front() splice() 函数
  10. Angular 脚手架