集合数据查找中orElseGet的使用

本文介绍了Java Optional类的orElseGet方法的使用,通过示例展示了如何在找不到特定条件的学生时,逐步寻找备选条件。文章还讨论了在处理可能存在的null值时遇到的异常问题,并提出了两种解决方案:整体过滤和逐条件验证。最后,分析了两种方法的优缺点,强调了处理null值的重要性。
摘要由CSDN通过智能技术生成

Optional用法实例一

数据准备

 List<Student> list = new ArrayList<>();
        list.add(new Student("王一", 21, "11", 1, new BigDecimal("193.0")));
        list.add(new Student("郑二", 22, "22", 0, new BigDecimal("171.0")));
        list.add(new Student("张三", 23, "33", 1, new BigDecimal("180.1")));
        list.add(new Student("李四", 24, "44", 0, new BigDecimal("183.2")));
        list.add(new Student("赵五", 25, "55", 1, new BigDecimal("178.3")));

orElseGet

简单的示例

需求:

  1. 假定List值中没有null,Student中可以有null
  2. 假定有相同的只返回找到的第一个
  3. 找年龄为26的数据,没有就找分数为66的数据,再没有就找身高最高的数据,再没有返回null
  4. 注:orElse不论optional有没有值的时候都会执行;orElseGet只会在optional为空时执行
  5. 注: [-128,127]非此区间内不要使用==去比较
    Student student =
                list.stream()
                        .filter(a -> 26 == a.getAge()).findFirst()
                        .orElseGet(
                                () -> list.stream().filter(b -> "66".equals(b.getScore())).findFirst()
                                        .orElseGet(
                                                () -> list.stream().max(Comparator.comparing(Student::getHeight, BigDecimal::compareTo))
                                                        .orElse(null)

                                        )

                        );

会出现的异常问题

当前面提到的条件中有null值存在的话会出现NPE。

解决措施一

先整体过滤,在此基础上再进行查找操作。

List<Student> collect = list.stream()
                .filter(a -> a.getAge() != null && a.getScore() != null && a.getHeight() != null)
                .collect(Collectors.toList());

此方法的问题:只有都满足条件是才保留,其余情况都被过滤。会导致一些有用的数据被过滤掉,从而最终得到的结果不符合需求本身。

解决措施二

每次进行条件判断前先验证。
此方法中涉及到对null的排序问题看此处链接排序

  Student student =
                list.stream()
                        .filter(
                                a -> a.getAge() != null && 26 == a.getAge()
                        ).findFirst()
                        .orElseGet(
                                () -> list.stream().filter(
                                        b -> b.getScore() != null && "66".equals(b.getScore())
                                ).findFirst()
                                        .orElseGet(
                                                () -> list.stream().max(
                                                        Comparator.comparing(Student::getHeight, Comparator.nullsFirst(BigDecimal::compareTo))
                                                )
                                                        .orElse(null)
                                        )

                        );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值