本文记录collect的高级用法。
依然先准备测试数据
class Item implements Comparable<Item> { public String id; public int count; public Item(String id, int count) { this.id = id; this.count = count; } @Override public int compareTo(Item o) { return count - o.count; } @Override public String toString() { return String.format("(%s, %d)", id, count); } }
Item item1 = new Item("it1", 1); Item item2 = new Item("it2", 3); Item item3 = new Item("it3", 2); Item item4 = new Item("it4", -1); List<Item> list = new ArrayList<>(); list.add(item1); list.add(item2); list.add(item3); list.add(item4);
1. 转化成其他类型的集合
例如 toSet(),toList(),也可以限定具体的类型:
Set<Item> set = list.stream().collect(Collectors.toCollection(TreeSet::new));
如果Item没有实现Comparable, refer Using streams to collect into TreeSet with custom comparator
2. 转化成一个value
例如minBy,maxBy,averagingInt等
Optional<Item> res = list.stream() .collect(Collectors.minBy( Comparator.comparingInt(item -> item.count)));
double aver = list.stream().collect(Collectors.averagingInt(item -> item.count));
对于string类型的可以通过join连接
String join = list.stream() .map(item -> item.id) .collect(Collectors.joining(",", "[", "]")); //返回[it1,it2,it3,it4]
3. 分割 -- 根据判断结果分成两组
Map<Boolean, List<Item>> map = list.stream() .collect(Collectors.partitioningBy(item -> item.count > 1)); // {false=[(it1, 1), (it4, -1)], true=[(it2, 3), (it3, 2)]}
4. 分组 -- 和SQL中的groupby类似
可以实现分割的功能,为了突出效果,可以将item2的count值设置为2,然后按照count进行分组
Map<Integer, List<Item>> map = list.stream() .collect(Collectors.groupingBy(item -> item.count)); // {-1=[(it4, -1)], 1=[(it1, 1)], 2=[(it2, 2), (it3, 2)]}
5. 组合使用
比较多的在groupingBy中使用
比如求count相同的item个数
Map<Integer, Long> countMap = list.stream() .collect(Collectors.groupingBy( item -> item.count, Collectors.counting())); // {-1=1, 1=1, 2=2}
比如按count分组,结果以字符串的形式连接
Map<Integer, String> strMap = list.stream() .collect(Collectors.groupingBy( item -> item.count, Collectors.mapping(it -> it.id, Collectors.joining(",", "[", "]")))); // {-1=[it4], 1=[it1], 2=[it2,it3]}
其实就是分组完成后,对每个list进行二次操作
关于自定义collector的话题,这边不cover了。
相关推荐
● lambda表达式语法 ● 流与管道的基本操作 ● 使用收集器与汇聚来终止管道 ● 创建流 ● 分割迭代器、fork/join框架与异常 ● 使用微基准测试检查流的性能 ● 使用默认方法演化API 目录 第1章 走进新生代...
Stream、Lambda表达式练习.doc
2_Lambda表达式.zip2_Lambda表达式.zip2_Lambda表达式.zip
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
主要介绍了解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
适用人群 本源码资源适用于具备一定Java编程基础的开发人员和学习者。...2、函数式接口与Lambda表达式:学习如何使用Lambda表达式与不同类型的函数式接口进行交互,并了解如何通过Lambda表达式实现函数的传递和组合
通过多个示例详细演示了.Net中C#语言lambda表达式的基本用法,主要包括三个方面内容: 1.什么是lambda表达式 2.理解lambda表达式 3.使用lambda表达式
Microsoft Visual Studio.Net(VS2010)编写的lambda表达式语法控制台程序。
用于将将字符串转换为lambda表达式,对于实时获取运算结果或界面筛选条件,很有帮助
Lambda表达式之集合操作,代码里主要针对java 集合list的操作
Java8的lambda表达式
简单的一些lambda表达式的测试代码,可用来学习简单的一些lambda表达式的测试代码,可用来学习
java lambda表达式,lambda 表达式基本上表达了函数式接口的实例(具有单一抽象方法的接口称为函数式接口。一个例子是 java.lang.Runnable)。lambda 表达式实现了唯一的抽象函数,因此实现了函数式接口 lambda ...
Lambda表达式浅析
什么是Linq表达式什么是Lambda表达式.pdf 什么是Linq表达式什么是Lambda表达式.pdf
java8lambda表达式的安卓Studio工程Demo,供初步学习使用
精通lambda表达式:Java多核编程,使用lambda表达式和流的最佳实践
lambda表达式和递归算法
关于Java中lambda的表达式,Java多核编程,清华大学(出版)
C#将Lambda表达式转成Sql语句,根据自己看的文章手写出来的,并配有自己理解的注释,有需要的同学可以自行下载。