[Java] 非空判断Optional用法总结

本文介绍了Java8中Optional类的引入背景,如何通过Optional类避免空指针异常,以及其常见的使用方法如map、filter、flatMap等,展示了如何通过链式操作简化代码并提供默认值处理。
摘要由CSDN通过智能技术生成

简介

从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空

例子

传统方法处理空指针

String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();

那么就需要用if-else语句

if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        Country country = address.getCountry();
        if (country != null) {
            String isocode = country.getIsocode();
            if (isocode != null) {
                isocode = isocode.toUpperCase();
            }
        }
    }
}

使用Optional改进

Optional.ofNullable(user)
        .map(User::getAddress)
        .map(Address::getCountry)
        .map(Country::getIsocode)
        .map(String::toUpperCase)
        .ifPresent(isocode -> {
            // 处理非空的 isocode
            System.out.println("Updated isocode: " + isocode);
        });

这里的每个 map 方法都会对 Optional 中的值进行映射操作,如果某个阶段的值为 null,则整个表达式会在该处终止,不再往下执行。最后的 ifPresent 方法用于处理映射后的非空值。

常见使用方法

创建Optional对象

  • 创建一个空的Optional实例
Optional<String> emptyOptional = Optional.empty()
  • 创建一个Optional实例,且不能为空,否则会抛出异常
Optional<String> strOpt = Optional.of("Cannot be null")
  • 创建一个Optional实例,可以为空,也可以不为空
Optional<String> nullOrExist = Optional.ofNullable("aaa");
Optional<String> nullOrExist = Optional.ofNullable(null);

获取Optional对象中的值

直接使用get方法

Optional<String> strOpt = Optional.of("Cannot be null")
String myStr = strOpt.get()

如果为空,则指定一个生成器,可用于返回默认值

Optional<String> strOpt = Optional.ofNullable(null)
String myStr = strOpt.orElseGet(() -> "this is a string if null")

如果为空抛出异常

Optional<String> strOpt = Optional.ofNullable(null)
String myStr = strOpt.orElseThrow(RuntimeException::new)

判断是否包含对象

使用isPresent

Optional<String> strOpt = Optional.ofNullable(null)
if (strOpt.isPresent()) {
	System.out.println("exist")
}

使用ifPresent,并给出存在后执行的内容

Optional<String> myStr = Optional.of("this is a string");
myStr.ifPresent(str -> System.out.println("das" + 2));

过滤转换

使用filter,注意,如果条件满足filter会返回一个Optional对象,不满足则会返回一个空的Optional对象,因此可以链式调用,也可以在末尾加上ifPresentorElse等等

Optional<Apple> appleCanBeNull = Optional.ofNullable(new Apple(125.5F, Color.RED));
Optional<Apple> apple = appleCanBeNull.filter(a -> a.getWeight() > 150)
									  .filter(a -> Color.RED.equals(a.getColor()));;
if (apple.isPresent()) {
    System.out.println("apple greater than 100 exists");
}

使用map进行值的转换,可用于获取对象的具体属性,例如获取苹果的重量

Float appleWeight = appleCanBeNull.map(Apple::getWeight).orElse(0.0F);

使用flatMap获取一个被Optional包装的对象的具体属性

Optional<Float> weight = appleCanBeNull.flatMap(apple -> Optional.ofNullable(apple.getWeight()));
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The Daylight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值