• java8 List的Stream流操作 (实用篇 三)


    目录

    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 Comparator.comparing() 关键方法

    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 list.stream-CSDN博客

    java8 List的Stream流操作 (特别篇 二) toMap_java list tomap-CSDN博客

    和实际开发中的需求、按开发使用率排

    初始数据

    1.    List userList = Lists.newArrayList();
    2.        userList.add(new User(1,"天一","男",16,true));
    3.        userList.add(new User(2,"空二","女",19,true));
    4.        userList.add(new User(3,"张三","男",18,true));
    5.        userList.add(new User(4,"李四","女",38,true));
    6.        userList.add(new User(5,"王五","男",18,true));
    7.        userList.add(new User(6,"王六","男",18,true));
    8.        userList.add(new User(7,"王七","男",18,true));
    9.        userList.add(new User(7,"王七","男",18,true));
    10.        userList.add(new User(8,"王七","男",null,true));

    1、Stream过滤:

    过滤是我们基本必用的 不管是过滤null值还是按条件过滤都是最常用的。

    过滤-常用方法

    1.1 筛选单元素--年龄等于18
    1. //筛选单元素--年龄等于18
    2. List filterAgeEqual = userList.stream().filter(user -> user.getAge() == 18).collect(Collectors.toList());
    1.2 筛选单元素--年龄大于18
    1. //筛选单元素--年龄大于18
    2. List filterAgeRange = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
    1.3 筛选范围--年龄大于18 and 年龄小于40
    1. //筛选范围--年龄大于18 and 年龄小于40
    2. List filterAgeRange2 = userList.stream().filter(user -> user.getAge() > 18 && user.getAge() < 40).collect(Collectors.toList());
    1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex==男
    1. //多条件筛选--年龄大于18 or 年龄小于40 and sex==男
    2. List filterAgeRange3 = userList.stream().filter(user -> user.getAge() > 18 || user.getAge() < 40 && "男".equals(user.getSex())).collect(Collectors.toList());
    1.5 多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合
    1. //多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合
    2. List nameList = userList.stream().filter(user -> (user.getAge() > 18 || user.getAge() < 40) && "男".equals(user.getSex())).map(User::getUserName).collect(Collectors.toList());

    2、Stream去重(集合去重和按元素去重)

    去重-常用方法(关键字distinct、concat和利用set、map)

    2.1 关键字distinct去重

    集合内的对象去重--结果是有序的

    List distinctList = userList.stream().distinct().collect(Collectors.toList());
    2.2 关键字concat合并和distinct 去重

    concat:合并两个流 distinct:去重

    1. //concat:合并两个流 distinct:去重
    2. List concatAnddistinctList = Stream.concat(userList.stream(), userList.stream()).distinct().collect(Collectors.toList());
    2.3 用set集合去重

    集合内的对象去重--结果乱序

    1. //集合内的对象去重--结果乱序
    2. Set setDistinct = userList.stream().collect(Collectors.toSet());
    2.4 用map去重--以某个元素去重

    以某个元素去重--用map集合 (v1, v2) -> v1 使用v1是表示保留age(年龄)第一次出现的对象、如果使用v2是保留age(年龄)最后一次出现的对象

    1. List mapDistinct = userList.stream()
    2. .collect(Collectors.collectingAndThen(
    3. Collectors.toMap(User::getAge, Function.identity(), (v1, v2) -> v1),
    4. map -> new ArrayList<>(map.values())
    5. ));

    3、Stream拼接(joining)

    拼接-常用方法

    3.1 集合内某个字段拼接

    姓名以,拼接

    1. //姓名以,拼接
    2. String userNameList = userList.stream().map(User::getUserName).collect(Collectors.joining(","));
    3.2 对象内的指定元素map拼接、返回集合

    每个对象都以 userId-userName-age 拼接、然后返回String集合

    1. //每个对象都以 userId-userName-age 拼接、然后返回String集合
    2. List strList = userList.stream().map((User user) -> user.getUserId() + "-" + user.getUserName() + "-" + user.getAge()).collect(Collectors.toList());
    3.3 对象内的指定元素map拼接、再全部拼接

    每个对象都以 userId-userName-age 拼接、再以 , 拼接返回字符串

    1. //每个对象都以 userId-userName-age 拼接、再以 , 拼接返回字符串
    2. String userIdAndAgeNameAndList = userList.stream().map((User user) -> user.getUserId() + "-" + user.getUserName() + "-" + user.getAge()).collect(Collectors.joining(","));

    4、Stream分组即组装成map(groupingBy、toMap)

    分组-常用方法

    4.1 groupingBy-通过年龄分组
    1. //groupingBy-通过年龄分组
    2. Map> userGroupingByMap = userList.stream().collect(Collectors.groupingBy(User::getAge));
    3. userGroupingByMap.forEach((k, v) -> {
    4. System.out.println(k + ":" + v);
    5. });
    4.2 根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
    1. //根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
    2. Map> mp6 = userList.stream().collect(Collectors.groupingBy(User::getUserId, Collectors.mapping(User::getUserName, Collectors.toList())));
    4.3 toMap-通过userId分组(key重复会报错)
    1. //toMap-通过userId分组(key重复会报错)
    2. Map userToMap = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getUserId, Function.identity()));
    4.4 toMap-通过age分组、取前面的值
    1. //toMap-通过age分组、取前面的值
    2. Map userToMap2 = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getAge, Function.identity(), (v1, v2) -> v1));
    4.5 toMap-通过age分组、取后面的值
    1. //toMap-通过age分组、取后面的值
    2. Map userToMap3 = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getAge, Function.identity(), (v1, v2) -> v2));
    4.6 toMap-通过男女分组、并且累加age
    1. //toMap-通过男女分组、并且累加age
    2. Map userToMap4 = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getSex, User::getAge, (v1, v2) -> v1 + v2));
    3. userToMap4.forEach((k, v) -> {
    4. System.out.println(k + ":" + v);
    5. });

    5、Stream排序:

    开发中有很多都是组装的集合、而要求返回的集合是有序的 (使用率不高的原因是数据库查询支持排序)、

    排序-常用方法

    单元素排序方法

    5.1 compareTo 关键字

    (o1, o2) -> o1.getUserId().compareTo(o2.getUserId()) 升序 (o1, o2) -> o2.getUserId().compareTo(o1.getUserId()) 降序

    通过指定的userId字段排序

    1. //升序 只写sorted()默认是升序、 我是为了演示才写完整的、开发中可以直接写sorted()
    2. List sortedCompareTo = userList.stream().sorted((o1, o2) -> o1.getUserId().compareTo(o2.getUserId())).collect(Collectors.toList());
    3. //降序
    4. List sortedReversed= userList.stream().sorted((o1, o2) -> o2.getUserId().compareTo(o1.getUserId())).collect(Collectors.toList());
    5.2 Comparator.comparing() 关键方法

    默认升序 加reversed()为降序

    1. //默认升序
    2. List sortedComparator = userList.stream().sorted(Comparator.comparing(User::getUserId)).collect(Collectors.toList());
    3. //reversed()为降序
    4. List sortedComparatorReversed = userList.stream().sorted(Comparator.comparing(User::getUserId).reversed()).collect(Collectors.toList());
    5.2.1 排序通常和过滤一起使用、如果元素为空会报错
    1. //排序通常和过滤一起使用、如果元素为空会报错
    2. List sortedFilter = userList.stream().filter(user -> user.getAge() != null).sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
    5.2.2 多个元素排序方法

    排序通常和过滤一起使用、 先用age排序、年龄相同再用userId排序(默认是升序)

    1. //排序通常和过滤一起使用、 先用age排序、年龄相同再用userId排序(默认是升序)
    2. Stream sortedComparators = userList.stream().filter(user -> user.getAge() != null).sorted(Comparator.comparing(User::getAge).thenComparing(User::getUserId));

    排序通常和过滤一起使用、 先用age排序升序、年龄相同再用userId排序降序

    1. //排序通常和过滤一起使用、 先用age排序升序、年龄相同再用userId排序降序
    2. Stream sortedComparatorReverseds = userList.stream().filter(user -> user.getAge()!=null).sorted(Comparator.comparing(User::getAge).thenComparing(User::getUserId).reversed());
    5.3 自定义排序

    先按年龄再按userId自定义排序(降序)

    1. //先按年龄再按userId自定义排序(降序)
    2. List sortedCustom = userList.stream().sorted((u1, u2) -> {
    3. if (Objects.equals(u1.getAge(), u2.getAge())) {
    4. return u2.getAge() - u1.getAge();
    5. } else {
    6. return u2.getUserId() - u1.getUserId();
    7. }
    8. }).collect(Collectors.toList());

    6、Stream统计(count、sum、max、min、average)

    统计-常用方法

    6.1 count-获取user集合中年龄大于18岁的人数
    1. //count-获取user集合中年龄大于18岁的人数
    2. Long count = userList.stream().filter(user->user.getAge() > 18).count();
    3. System.out.println("user集合中年龄大于18岁的人数:"+count);
    6.2 sum-获取user集合中所有人的年纪的总和
    1. //sum-获取user集合中所有人的年纪的总和
    2. Long summingLong = userList.stream().map(User::getAge).collect(Collectors.summingLong(Integer::longValue));
    3. System.out.println("user集合中所有人的年纪的总和:"+summingLong);
    6.3 max-获取user集合中所有人年纪最大的人
    1. //max-获取user集合中所有人年纪最大的人
    2. Optional max = userList.stream().max(Comparator.comparing(User::getAge));
    3. System.out.println("user集合中年纪最大的人是:"+max.get().getUserName());
    6.4 min-获取user集合中所有人年纪最小的人
    1. //min-获取user集合中所有人年纪最小的人
    2. Optional min = userList.stream().min(Comparator.comparing(User::getAge));
    3. System.out.println("user集合中年纪最小的人是:"+min.get().getUserName());
    6.5 average-获取user集合中所有人的年纪的平均值
    1. //average-获取user集合中所有人的年纪的平均值
    2. Double average = userList.stream().map(User::getAge).collect(Collectors.averagingDouble(Integer::doubleValue));
    3. System.out.println("user集合中所有人的年纪的平均值:"+ average);

    7、Stream分页(skip、limit)

    分页-常用方法

    7.1 skip:跳过前n个数据 、limit:获取前n个数据
    1. //skip:跳过前n个数据 、limit:获取前n个数据
    2. List skipAndLimit = userList.stream().skip(1).limit(2).collect(Collectors.toList());
    3. if(!CollectionUtils.isEmpty(skipAndLimit)){
    4.    skipAndLimit.forEach(System.out::println);
    5. }

  • 相关阅读:
    Merge Joins(PostgreSQL 14 Internals翻译版)
    Jmeter的使用教程(安装)
    甘露糖-酰基|mannose-Hydrazide|酰基-PEG-甘露糖
    java基于springboot高校信息资源共享网站系统
    未来:spring响应式编程 Hands-On Reactive Programming in Spring 5(三),spring事件监听
    安装Redis
    Kubeadm搭建k8s
    Linux--网络基础(概念+协议的了解+OSI七层模型,TCP/IP五层协议,网络数据传输流程)
    win10 安装yolov7 训练自己的数据集
    JavaScript变量提升
  • 原文地址:https://blog.csdn.net/qq_42672839/article/details/135455411