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