java8 collectors类_java8之collectors
java8中提供了对集合进行转化,然后进行归集的的操作。这就不得不提Collectors这个类了,真的很强大,我们看示例吧。
KeyAndValue a1 = newKeyAndValue().setName("kevin").setValue("lee");
KeyAndValue a2 = newKeyAndValue().setName("kevin").setValue("lee");
KeyAndValue a3 = newKeyAndValue().setName("kevin1").setValue("lee");
KeyAndValue a4 = newKeyAndValue().setName("kevin1").setValue("123123");
KeyAndValue a5 = newKeyAndValue().setName("kevin2").setValue("lee5");
KeyAndValue a6 = newKeyAndValue().setName("kevin3").setValue("lee8");
List list = Arrays.asList(a1, a2, a3, a4, a5, a6);
基础的toList、toSet、toMap就不讲了,简单易用,一看就会,我说说稍微复杂的。
collectingAndThen:使用collector进行归集,然后对归结的结果进行加工
List collect = list.stream().collect(Collectors.collectingAndThen(Collectors.mapping(a -> a.getValue(), Collectors.toList()), v -> {
v.sort(Comparator.comparing(String::length).reversed());
returnv;
}));
System.out.println(collect);
//[123123, lee5, lee8, lee, lee, lee]
groupingBy分组操作:基于一个key值,对元素进行分组
Map> collect = list.stream().collect(Collectors.groupingBy(a -> a.getName()));
System.out.println(JSON.toJSONString(collect));
// {"kevin":[{"name":"kevin","value":"lee"},{"name":"kevin","value":"lee"}],"kevin2":[{"name":"kevin2","value":"lee5"}],"kevin1":[{"name":"kevin1","value":"lee"},{"name":"kevin1","value":"123123"}],"kevin3":[{"name":"kevin3","value":"lee8"}]}
Map> collect1 = list.stream().collect(Collectors.groupingBy(KeyAndValue::getName, Collectors.mapping(b -> b.getValue(), Collectors.toSet())));
System.out.println(JSON.toJSONString(collect1));
// {"kevin":["lee"],"kevin2":["lee5"],"kevin1":["123123","lee"],"kevin3":["lee8"]}
Map> collect3 = list.stream().collect(Collectors.groupingBy(KeyAndValue::getName, Collectors.toSet()));
System.out.println(JSON.toJSONString(collect3));
// {"kevin":[{"name":"kevin","value":"lee"}],"kevin2":[{"name":"kevin2","value":"lee5"}],"kevin1":[{"name":"kevin1","value":"lee"},{"name":"kevin1","value":"123123"}],"kevin3":[{"name":"kevin3","value":"lee8"}]}
Map> collect4 = list.stream().collect(Collectors.groupingBy(KeyAndValue::getName,TreeMap::new, Collectors.toSet()));
System.out.println(JSON.toJSONString(collect4));
// {"kevin":[{"name":"kevin","value":"lee"}],"kevin1":[{"name":"kevin1","value":"lee"},{"name":"kevin1","value":"123123"}],"kevin2":[{"name":"kevin2","value":"lee5"}],"kevin3":[{"name":"kevin3","value":"lee8"}]}
join 操作:对元素进行拼接,有三个方法。
String joinResult = list.stream().map(KeyAndValue::getName).collect(Collectors.joining());
System.out.println(joinResult);
//kevinkevinkevin1kevin1kevin2kevin3
String joinResult1 = list.stream().map(KeyAndValue::getName).collect(Collectors.joining(","));
System.out.println(joinResult1);
// kevin,kevin,kevin1,kevin1,kevin2,kevin3
String joinResult2 = list.stream().map(KeyAndValue::getName).collect(Collectors.joining(",","(",")"));
System.out.println(joinResult2);
// (kevin,kevin,kevin1,kevin1,kevin2,kevin3)
partitioningBy操作:基于断言对元素按true和false进行分组
Map> partitioningBy = list.stream()
.collect(Collectors.partitioningBy(k -> k.getName().equals("kevin")));
System.out.println(partitioningBy);
//{false=[KeyAndValue(name=kevin1, value=lee), KeyAndValue(name=kevin1, value=123123), KeyAndValue(name=kevin2, value=lee5), KeyAndValue(name=kevin3, value=lee8)], true=[KeyAndValue(name=kevin, value=lee), KeyAndValue(name=kevin, value=lee)]}
Map> partitioningBy1 = list.stream()
.collect(Collectors.partitioningBy(k -> k.getName().equals("kevin"), Collectors.mapping(v -> v.getValue(), Collectors.toList())));
System.out.println(partitioningBy1);
// {false=[lee, 123123, lee5, lee8], true=[lee, lee]}
min/minBy , max/maxBy 用法一致:使用一个比较器获得最大值或最小值
Optional min = list.stream().map(KeyAndValue::getName).min(Comparator.comparing(v->v.length()));
System.out.println(min.get());
//kevin
Optional min1 = list.stream().min(Comparator.comparing(v->v.getValue().length()));
System.out.println(min1.get());
// KeyAndValue(name=kevin, value=lee)
Optional min2 = list.stream().map(KeyAndValue::getName).collect(Collectors.minBy(Comparator.comparing(String::length)));
System.out.println(min2.get());
//kevin
Optional min3 = list.stream().collect(Collectors.minBy(Comparator.comparing(v->v.getValue().length())));
System.out.println(min3.get());
// KeyAndValue(name=kevin, value=lee)
mapping操作:使用一个function对元素进行加工,然后使用collector进行收集
List mapping = list.stream().collect(Collectors.mapping(v -> v.getValue().concat("agc"), Collectors.toList()));
System.out.println(mapping);
//类似Stream先进行map操作,再进行collectList mapping_ = list.stream().map(v -> v.getValue().concat("agc")).collect(Collectors.toList());
System.out.println(mapping_);
// [leeagc, leeagc, leeagc, 123123agc, lee5agc, lee8agc]
toCollection:将元素按照顺序复制到另一个收集器(集合)中,类似于Collectors.toList()
ArrayList collect1 = list.stream().collect(Collectors.toCollection(ArrayList::new));
System.out.println(collect1);
// [KeyAndValue(name=kevin, value=lee), KeyAndValue(name=kevin, value=lee), KeyAndValue(name=kevin1, value=lee), KeyAndValue(name=kevin1, value=123123), KeyAndValue(name=kevin2, value=lee5), KeyAndValue(name=kevin3, value=lee8)]
根据某个属性进行去重
TreeSet collect = list.stream().collect(Collectors.toCollection(() -> newTreeSet(Comparator.comparing(KeyAndValue::getName))));
System.out.println(collect);
// [KeyAndValue(name=kevin, value=lee), KeyAndValue(name=kevin1, value=lee), KeyAndValue(name=kevin2, value=lee5), KeyAndValue(name=kevin3, value=lee8)]
java8 collectors类_java8之collectors相关推荐
- collectors 求和_Java8中Collectors求和功能的自定义扩展
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 起因 业务中需要将一组数据分类后收集总和,原本可以使用Collect ...
- Java8的Stream中的Collectors操作求double类型和的坑
Java8的Stream中的Collectors操作求double类型和的坑 无敌踩坑王的我又双叒叕来了!!!!!! 例子: @Testpublic void testSumDouble() {dou ...
- Jdk1.8 Collectors类使用详解(实用干货)
Collectors类大家都并不陌生,从jdk1.8开始跟stream()流配合之后,写代码效率得到提升,源码里我们可以看到有很多的方法,比如groupingBy 和maxBy,这些都是干嘛的呢,这篇 ...
- java8实战怎么样_Java8中你可能不知道的一些地方之Stream实战
说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...
- java8 流操作_java8中的流操作
Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过 ...
- java8 时间类API
前言 Instant LocalDate Clock SystemnanoTime 前言 (未完待续) 推荐一篇系统学习的java8时间类文章 我这里会介绍java8 新API中常用个类怎么用 应该是 ...
- 使用Java8 Files类读写文件
Java8 Files类的newBufferedReader()和newBufferedWriter()方法 这两个方法接受Path类型的参数.Path 类是Java8 NIO中的接口.可以由Path ...
- java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的
一.Collectors.toList() 现在有个集合: List<User> users = getUserList(); 现在需要将这些user的id提取出来.这个很简单,for循环 ...
- collectors排序_java8特性:Collectors.groupingBy进行分组、排序等操做 (二)
Stream类的函数java R collect(Collector super T, A, R> collector); 能够对数据集进行简单的分组统计.函数参数为接口Collector,其实 ...
最新文章
- 下列有关mysql数据库中的null值_MySQL数据库中与 NULL值有关的问题
- 计算机网络最基础知识
- 高滤波器opencv(Python)
- 两个服务器之间怎么传输大量数据速度快 java socket_一口气说出Kafka为啥这么快?...
- [编程题]表达式合法判断
- 流程再造:信息化建设的最佳拍档
- java7和java8切换_切换表达式到Java吗?
- 在Python中使用Seaborn和WordCloud可视化YouTube视频
- 前端学习(3146):react-hello-react之getDenvied
- PDF 补丁丁 0.6.0.3369 版发布(修复保存文件时文件名替代符失效的问题)
- [ACM] hdu 1285 确定比赛 (拓扑排序)
- 折半查找的实现(1010)swust-oj
- 从初级程序员逆袭为技术大牛,你需要懂这 10 项技术!
- 按clear按钮清空两个文本框的内容,按copy按钮时将Source文本框的内容复制到Target文本框,按close按钮结束程序的运行
- PhotoMill X for Mac(图片批处理工具)
- 用代码排出自己的名字
- 无缝拼接屏是怎样实现的?有什么特点!
- AM3352时钟系统分析
- vue图片宽高自适应_Vue组件宽高自适应问题
- Geom error原因以及解决办法