Jdk1.8 Collectors类使用详解(实用干货)
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类使用详解(实用干货)相关推荐
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- .net System.Web.Caching.Cache缓存类使用详解(转载)
转自:http://www.cnblogs.com/virusswb/articles/1681561.html net System.Web.Caching.Cache缓存类使用详解 System. ...
- ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解
一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...
- Java记录 -22- Java的基类Object详解
Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. Oracle官方在线 Java API Specifications http://www.oracle.co ...
- C#中NameValueCollection类用法详解
C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...
- pythonsvc_sklearn-SVC实现与类参数详解
sklearn-SVC实现与类参数 它是基于libsvm实现的.随着样本数量的增加,拟合时间的复杂度要高于二次,这就使得当样板数量超过一万个时,很难扩展到数据集中. 在多类处理时,是按照1对1的方案进 ...
- laravel 如何 new php 类,PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解...
<PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解>要点: 本文介绍了PHP实例:laravel通过创建自定义artisan make命令来新建类文件详 ...
- (117)System Verilog类继承详解
(117)System Verilog类继承详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类继承详解 5)结语 1.2 FPGA ...
- (116)System Verilog类合成(类包含关系)详解
(116)System Verilog类合成(类包含关系)详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类合成(类包含关系)详解 ...
最新文章
- 利用sort对多字段排序
- 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
- python include_tag_详解Python的Django框架中inclusion_tag的使用
- VS2010打不开创建的项目的解决方法
- python写快排_python 实现快速排序
- x86汇编-1(第一章—第二章)8086处理器基本情况
- EOJ_1024_表达式
- Spring学习笔记--导航
- 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则
- 引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
- [转]VS .NET 2005中水晶报表的打包部署
- npoi excel导入html数据库,C#_.NetFramework_Web项目_NPOI_EXCEL数据导入
- 传智播客 C/C++学习笔记 函数调用 模型
- 除了加速上币,OKEx在DeFi热潮中还能做什么?
- 童年记忆中做过的农活
- 闲鱼上卖什么东西一年赚了18万?
- 【Error】初始化ant design pro项目时遇到“pro 不是内部或外部命令”
- 基于python的手写数字识别实验报告_联机手写数字识别实验报告
- 弘泰俱乐部杨乐、车彦娇团队:凝聚慈善力量,关爱孤困儿童
- getMethod方法getMethod(String name, Class<?>... parameterTypes)传入可变参数类型