Java8新特性——Optional类

引言

Null Pointer Exception空指针异常在Java中可以说是很常见了,所以一般会在代码逻辑中进行if判空;Java8新特性中有一个Optional类在一些情况下可以更加优雅的进行判空处理,下面简单介绍一下常用的几个方法;

创建Optional类

创建Optional类有三个方法(都是静态方法):

empty()

创建一个空的Optional对象,没有任何参数赋值;

image-20220707110952846

Optional<Object> optionalEmpty = Optional.empty(); // 创建一个空的Optional类

of(T t)

创建一个非空的Optional对象,且参数t不能为空;

image-20220707111153655

String str = "Hello World";
Optional<String> optionalStr = Optional.of(str); // str不能为空

*ofNullable(T t)

参数t可以为空,如果为空创建一个Optional空对象,如果非空创建对应有参数的对象;

image-20220707111603895

从源码中可以看到,如果参数value为空则调用了empty()方法创建空对象,非空使用of()方法创建非空对象;可以说这个方法就是把上面两种方法整合到一起了;

该方法也是最常用的一个,所以一定要掌握这个方法;

String str = "Hello World";
Optional<String> optionalStr = Optional.ofNullable(str); // str可以为空

只会创建Optional看不出来有什么用,下面就看看如何使用Optional对象;

判断Optional类中是否有对象

Optional支持泛型,其实就可以把Optional类看成一个容器,内部可以放各种类型的对象;那么下面就看看如何操作这些对象;

isPresent()

该方法可以判断Optional类中的对象是否为空;

image-20220707112439405

value就是创建Optional类时给它赋的值;该方法返回值是一个布尔类型;

boolean present = Optional.ofNullable(null).isPresent(); // present为false

ifPresent(Consumer<? super T> consumer)

该方法的参数是Consumer函数式接口,是Lambda表达式里面的知识点,如果不了解可以学习一下,这里就不过多介绍了;

如果Optional对象中有值,则调用Consumer接口实现的代码,如果为空,不会有返回结果;

image-20220707113550863

Optional.ofNullable("hello").ifPresent(System.out::println); // 输出hello
Optional.ofNullable(null).ifPresent(System.out::println); // 什么也不输出

上面两种方法我在实际情况中也没有怎么用过,以后用到了再补充;

获取Optional类中的对象

一开始创建Optional对象时我们把值传入其中的目的就是为了使用Optional的一些方法/操作来让我们代码更优雅,之后还是要获取到传入的对象的;

get()

返回Optional对象中的实例值,如果实例值为空,即是一个空的Optional对象,那么抛出异常;

image-20220707114849383

源码还是比较容易看懂的;

String str = Optional.ofNullable("hello").get(); // str为hello
Object o = Optional.ofNullable(null).get(); // 抛出异常:java.util.NoSuchElementException: No value present

*orElse(T other)

这个方法对我来说也是比较常用的;作用是如果Optional类有实例值那么就返回该值,如果没有则返回传入的参数other的值;

image-20220707115505847

String s1 = Optional.ofNullable("hello").orElse("string is null"); // s1为hello
Object s2 = Optional.ofNullable(null).orElse("string is null"); // s2为string is null

// 假设有一个User自定义类型:
User user = null;
User ansUser = Optional.ofNullable(user).orElse(new User("张三", 11, "男", 1234)); // 输出为new User("张三", 11, "男", 1234)对象

项目中应用:

image-20220707122753263

orElseGet(Supplier<? extends T> other)

这个方法的参数是Supplier,同样是一个函数式接口,不过多介绍;

如果Optional类有实例值那么就返回该值,没有就返回Supplier接口实现提供的对象;

image-20220707120616584

这个方法没用过,用到了再补充;

String str = Optional.ofNullable("hello").orElseGet(() -> "test"); // str为hello

*orElseThrow(Supplier<? extends X> exceptionSupplier)

这个方法也比较好用,功能是Optional类有实例值那么就返回该值,没有就抛出指定的异常;参数类型还是Supplier;

image-20220707122249141

String s = null;
String str = Optional.ofNullable(s).orElseThrow(RuntimeException::new); // 抛出异常:java.lang.RuntimeException

之前我喜欢在些项目中用if判断前端传入参数是否为空,为空抛出自定义的异常:

image-20220707122506649

现在可以尝试替换成如下:

image-20220707122605248

以后有什么应用再补充;

总结

Optional不仅只有我列举的这些方法,这几种比较常见,其余有的方法和stream流的方法很相似就不说了;

当然有了Optional这些方法并不是说可以替换不适用if判断空指针了,还是要根据实际情况,选择最方便简洁的一种才行;

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YXXYX

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

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

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

打赏作者

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

抵扣说明:

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

余额充值