目录
java8 List的Stream流操作 (实用篇 三)
初始数据
1、Stream过滤:
过滤-常用方法
1.1 筛选单元素--年龄等于18
1.2 筛选单元素--年龄大于18
1.3 筛选范围--年龄大于18 and 年龄小于40
1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex==男
1.5 多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合
2、Stream去重(集合去重和按元素去重)
去重-常用方法(关键字distinct、concat和利用set、map)
2.1 关键字distinct去重
2.2 关键字concat合并和distinct 去重
2.3 用set集合去重
2.4 用map去重--以某个元素去重
3、Stream拼接(joining)
拼接-常用方法
3.1 集合内某个字段拼接
3.2 对象内的指定元素map拼接、返回集合
3.3 对象内的指定元素map拼接、再全部拼接
4、Stream分组即组装成map(groupingBy、toMap)
分组-常用方法
4.1 groupingBy-通过年龄分组
4.2 根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
4.3 toMap-通过userId分组(key重复会报错)
4.4 toMap-通过age分组、取前面的值
4.5 toMap-通过age分组、取后面的值
4.6 toMap-通过男女分组、并且累加age
5、Stream排序:
排序-常用方法
5.1 compareTo 关键字
5.2 () 关键方法
5.2.1 排序通常和过滤一起使用、如果元素为空会报错
5.2.2 多个元素排序方法
5.3 自定义排序
6、Stream统计(count、sum、max、min、average)
统计-常用方法
6.1 count-获取user集合中年龄大于18岁的人数
6.2 sum-获取user集合中所有人的年纪的总和
6.3 max-获取user集合中所有人年纪最大的人
6.4 min-获取user集合中所有人年纪最小的人
6.5 average-获取user集合中所有人的年纪的平均值
7、Stream分页(skip、limit)
分页-常用方法
7.1 skip:跳过前n个数据 、limit:获取前n个数据
java8 List的Stream流操作 (实用篇 三)
实际开发的时候想不起来Stream的一些常用方法、去找却很不方便、所以我准备再学一篇实用或者叫常用的stream相关方法的文章。学习整理也是方便查看
结合 java8 List的Stream流操作 (常用篇 一)_java -****博客
java8 List的Stream流操作 (特别篇 二) toMap_java list tomap-****博客
和实际开发中的需求、按开发使用率排
初始数据
List<User> userList = ();
(new User(1,"天一","男",16,true));
(new User(2,"空二","女",19,true));
(new User(3,"张三","男",18,true));
(new User(4,"李四","女",38,true));
(new User(5,"王五","男",18,true));
(new User(6,"王六","男",18,true));
(new User(7,"王七","男",18,true));
(new User(7,"王七","男",18,true));
(new User(8,"王七","男",null,true));
1、Stream过滤:
过滤是我们基本必用的 不管是过滤null值还是按条件过滤都是最常用的。
过滤-常用方法
1.1 筛选单元素--年龄等于18
//筛选单元素--年龄等于18
List<User> filterAgeEqual = ().filter(user -> () == 18).collect(());
1.2 筛选单元素--年龄大于18
//筛选单元素--年龄大于18
List<User> filterAgeRange = ().filter(user -> () > 18).collect(());
1.3 筛选范围--年龄大于18 and 年龄小于40
//筛选范围--年龄大于18 and 年龄小于40
List<User> filterAgeRange2 = ().filter(user -> () > 18 && () < 40).collect(());
1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex==男
//多条件筛选--年龄大于18 or 年龄小于40 and sex==男
List<User> filterAgeRange3 = ().filter(user -> () > 18 || () < 40 && "男".equals(())).collect(());
1.5 多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合
//多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合
List<String> nameList = ().filter(user -> (() > 18 || () < 40) && "男".equals(())).map(User::getUserName).collect(());
2、Stream去重(集合去重和按元素去重)
去重-常用方法(关键字distinct、concat和利用set、map)
2.1 关键字distinct去重
集合内的对象去重--结果是有序的
List<User> distinctList = ().distinct().collect(());
2.2 关键字concat合并和distinct 去重
concat:合并两个流 distinct:去重
//concat:合并两个流 distinct:去重
List<User> concatAnddistinctList = ((), ()).distinct().collect(());
2.3 用set集合去重
集合内的对象去重--结果乱序
//集合内的对象去重--结果乱序
Set<User> setDistinct = ().collect(());
2.4 用map去重--以某个元素去重
以某个元素去重--用map集合 (v1, v2) -> v1 使用v1是表示保留age(年龄)第一次出现的对象、如果使用v2是保留age(年龄)最后一次出现的对象
List<User> mapDistinct = ()
.collect((
(User::getAge, (), (v1, v2) -> v1),
map -> new ArrayList<>(())
));
3、Stream拼接(joining)
拼接-常用方法
3.1 集合内某个字段拼接
姓名以,拼接
//姓名以,拼接
String userNameList = ().map(User::getUserName).collect((","));
3.2 对象内的指定元素map拼接、返回集合
每个对象都以 userId-userName-age 拼接、然后返回String集合
//每个对象都以 userId-userName-age 拼接、然后返回String集合
List<String> strList = ().map((User user) -> () + "-" + () + "-" + ()).collect(());
3.3 对象内的指定元素map拼接、再全部拼接
每个对象都以 userId-userName-age 拼接、再以 , 拼接返回字符串
//每个对象都以 userId-userName-age 拼接、再以 , 拼接返回字符串
String userIdAndAgeNameAndList = ().map((User user) -> () + "-" + () + "-" + ()).collect((","));
4、Stream分组即组装成map(groupingBy、toMap)
分组-常用方法
4.1 groupingBy-通过年龄分组
//groupingBy-通过年龄分组
Map<Integer, List<User>> userGroupingByMap = ().collect((User::getAge));
((k, v) -> {
(k + ":" + v);
});
4.2 根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
//根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
Map<Integer,List<String>> mp6 = ().collect((User::getUserId, (User::getUserName, ())));
4.3 toMap-通过userId分组(key重复会报错)
//toMap-通过userId分组(key重复会报错)
Map<Integer, User> userToMap = ().filter(user -> () != null).collect((User::getUserId, ()));
4.4 toMap-通过age分组、取前面的值
//toMap-通过age分组、取前面的值
Map<Integer, User> userToMap2 = ().filter(user -> () != null).collect((User::getAge, (), (v1, v2) -> v1));
4.5 toMap-通过age分组、取后面的值
//toMap-通过age分组、取后面的值
Map<Integer, User> userToMap3 = ().filter(user -> () != null).collect((User::getAge, (), (v1, v2) -> v2));
4.6 toMap-通过男女分组、并且累加age
//toMap-通过男女分组、并且累加age
Map<String, Integer> userToMap4 = ().filter(user -> () != null).collect((User::getSex, User::getAge, (v1, v2) -> v1 + v2));
((k, v) -> {
(k + ":" + v);
});
5、Stream排序:
开发中有很多都是组装的集合、而要求返回的集合是有序的 (使用率不高的原因是数据库查询支持排序)、
排序-常用方法
单元素排序方法
5.1 compareTo 关键字
(o1, o2) -> ().compareTo(()) 升序 (o1, o2) -> ().compareTo(()) 降序
通过指定的userId字段排序
//升序 只写sorted()默认是升序、 我是为了演示才写完整的、开发中可以直接写sorted()
List<User> sortedCompareTo = ().sorted((o1, o2) -> ().compareTo(())).collect(());
//降序
List<User> sortedReversed= ().sorted((o1, o2) -> ().compareTo(())).collect(());
5.2 () 关键方法
默认升序 加reversed()为降序
//默认升序
List<User> sortedComparator = ().sorted((User::getUserId)).collect(());
//reversed()为降序
List<User> sortedComparatorReversed = ().sorted((User::getUserId).reversed()).collect(());
5.2.1 排序通常和过滤一起使用、如果元素为空会报错
//排序通常和过滤一起使用、如果元素为空会报错
List<User> sortedFilter = ().filter(user -> () != null).sorted((User::getAge)).collect(());
5.2.2 多个元素排序方法
排序通常和过滤一起使用、 先用age排序、年龄相同再用userId排序(默认是升序)
//排序通常和过滤一起使用、 先用age排序、年龄相同再用userId排序(默认是升序)
Stream<User> sortedComparators = ().filter(user -> () != null).sorted((User::getAge).thenComparing(User::getUserId));
排序通常和过滤一起使用、 先用age排序升序、年龄相同再用userId排序降序
//排序通常和过滤一起使用、 先用age排序升序、年龄相同再用userId排序降序
Stream<User> sortedComparatorReverseds = ().filter(user -> ()!=null).sorted((User::getAge).thenComparing(User::getUserId).reversed());
5.3 自定义排序
先按年龄再按userId自定义排序(降序)
//先按年龄再按userId自定义排序(降序)
List<User> sortedCustom = ().sorted((u1, u2) -> {
if (((), ())) {
return () - ();
} else {
return () - ();
}
}).collect(());
6、Stream统计(count、sum、max、min、average)
统计-常用方法
6.1 count-获取user集合中年龄大于18岁的人数
//count-获取user集合中年龄大于18岁的人数
Long count = ().filter(user->() > 18).count();
("user集合中年龄大于18岁的人数:"+count);
6.2 sum-获取user集合中所有人的年纪的总和
//sum-获取user集合中所有人的年纪的总和
Long summingLong = ().map(User::getAge).collect((Integer::longValue));
("user集合中所有人的年纪的总和:"+summingLong);
6.3 max-获取user集合中所有人年纪最大的人
//max-获取user集合中所有人年纪最大的人
Optional<User> max = ().max((User::getAge));
("user集合中年纪最大的人是:"+().getUserName());
6.4 min-获取user集合中所有人年纪最小的人
//min-获取user集合中所有人年纪最小的人
Optional<User> min = ().min((User::getAge));
("user集合中年纪最小的人是:"+().getUserName());
6.5 average-获取user集合中所有人的年纪的平均值
//average-获取user集合中所有人的年纪的平均值
Double average = ().map(User::getAge).collect((Integer::doubleValue));
("user集合中所有人的年纪的平均值:"+ average);
7、Stream分页(skip、limit)
分页-常用方法
7.1 skip:跳过前n个数据 、limit:获取前n个数据
//skip:跳过前n个数据 、limit:获取前n个数据
List<User> skipAndLimit = ().skip(1).limit(2).collect(());
if(!(skipAndLimit)){
(::println);
}