Java 8新特性Optional的含义与使用

是什么

Java 8 Optional 是一个容器类,它可以包含一个非空或者为空对象。它是为了解决 Java 中可能会出现 null 值引用的问题而设计的。

为什么

主要作用是提供一种更加安全和优雅的方式来处理可能为空的值。它可以让代码更加健壮,减少出现异常的可能性。同时,使用 Optional 也能够使代码更加易于维护和理解,因为它能够明确地指定一个值是否可为空。

好处包括:

1、可以避免出现 NullPointerException 异常。

2、使代码更加健壮,减少出现异常的可能性。

3、提高代码的可读性,使代码更加简洁明了。

4、使代码更加易于维护和理解,因为它能够明确地指定一个值是否可为空。

总的来说,使用 Optional 可以避免程序中出现 NullPointerException 异常,同时也能使代码更加简洁和易读。

怎么样

1、创建 Optional 对象

Optional 对象可以通过 of、ofNullable、empty 这三个静态方法创建:

  • of() 方法用于创建非空 Optional 对象,如果传入的值为 null,则会抛出 NullPointerException 异常。
  • ofNullable() 方法用于创建可能为空的 Optional 对象。
  • empty() 方法用于创建一个空的 Optional 对象。

2、获取 Optional 对象中的值

Optional 类提供了多个方法用于获取 Optional 对象中的值,如:

  • get() 方法用于获取 Optional 对象中的值,如果 Optional 对象为空,则会抛出 NoSuchElementException 异常。
  • orElse() 方法用于获取 Optional 对象中的值,如果 Optional 对象为空,则返回指定的默认值。
  • orElseGet() 方法用于获取 Optional 对象中的值,如果 Optional 对象为空,则返回指定的 Supplier 函数返回的值。
  • orElseThrow() 方法用于获取 Optional 对象中的值,如果 Optional 对象为空,则抛出指定的异常。

3、判断 Optional 对象是否为空

Optional 类提供了多个方法用于判断 Optional 对象是否为空,如:

  • isPresent() 方法用于判断 Optional 对象是否为空。
  • ifPresent() 方法用于在 Optional 对象不为空时执行指定的操作。

4、对 Optional 对象进行转换

  • 使用 map(Function<? super T, ? extends U> mapper) 方法对 Optional 对象进行转换,将 Optional 对象中的值转换为另一种类型。
  • 使用 flatMap(Function<? super T, Optional<U>> mapper) 方法对 Optional 对象进行转换,将 Optional 对象中的值转换为另一个 Optional 对象。

5、对 Optional 对象进行过滤操作

  • 可以使用 filter(Predicate<? super T> predicate) 方法对 Optional 对象进行过滤,将 Optional 对象中的值与指定条件进行比较,如果符合条件,则返回原来的 Optional 对象,否则返回一个空的 Optional 对象。

练习

1、 创建一个包含字符串 “hello” 的 Optional 对象。

Optional<String> optional = Optional.of("hello");

2、创建一个可能为空的 Optional 对象。

String str = null;
Optional<String> optional = Optional.ofNullable(str);

3、创建一个为空的 Optional 对象。

Optional<String> optional = Optional.empty();

4、获取一个包含字符串 "hello" 的 Optional 对象的值。

Optional<String> optional = Optional.of("hello");
String value = optional.get();
System.out.println(value); // 输出:hello

5、使用 orElse 获取一个空的 Optional 对象的默认值。

Optional<String> optional = Optional.empty();
String defaultValue = optional.orElse("default value");
System.out.println(defaultValue); // 输出:default value

6、使用 orElseGet 获取一个空的 Optional 对象的默认值。

Optional<String> optional = Optional.empty();
String defaultValue = optional.orElseGet(() -> "default value");
System.out.println(defaultValue); // 输出:default value

7、使用 orElseThrow() 方法在一个空的 Optional 对象上抛出异常。

Optional<String> optional = Optional.empty();
String value = optional.orElseThrow(() -> new RuntimeException("value is null"));
System.out.println(value);
// 输出:Exception in thread "main" java.lang.RuntimeException: value is null
//	at com.qf.cmf.javabase.optional.OptionalDemo02.lambda$main$0(OptionalDemo02.java:46)
//	at java.util.Optional.orElseThrow(Optional.java:290)
//	at com.qf.cmf.javabase.optional.OptionalDemo02.main(OptionalDemo02.java:46)

8、使用 isPresent() 方法判断 Optional 是否包含值

Optional<String> optional = Optional.of("hello world");
if (optional.isPresent()) {
    System.out.println("optional包含的值是:" + optional.get());
} else {
    System.out.println("optional为空");
}
// 输出:optional包含的值是:hello world

9、使用 ifPresent() 方法在 Optional 包含值时执行某个操作

Optional<String> optional = Optional.of("hello world");
optional.ifPresent(value -> System.out.println("optional包含的值是:" + value));
// 输出:optional包含的值是:hello world

10、使用 map() 方法将一个 Optional 对象的值转换为大写并返回一个新的 Optional 对象。

Optional<String> optional1 = Optional.of("hello");
Optional<String> optional2 = optional1.map(value -> value.toUpperCase());
System.out.println(optional2.get()); // 输出:HELLO

11、使用 flatMap() 方法将一个 Optional 对象的值转换为大写并返回一个新的 Optional 对象。

Optional<String> optional1 = Optional.of("hello");
Optional<String> optional2 = optional1.flatMap(value -> Optional.of(value.toUpperCase()));
System.out.println(optional2.get()); // 输出:HELLO

12、使用 filter() 方法过滤一个 Optional 对象,只有长度大于 5 的字符串才会被返回。

Optional<String> optional1 = Optional.of("hello world");
Optional<String> optional2 = optional1.filter(value -> value.length() > 5); // 输出:hello world

总结

Java Optional 的使用可以有效地避免 null 引用异常,但也需要注意不要过度使用 Optional,以免代码变得复杂难以维护。


技术学习关键在于技术知识的积累,日供一卒!

Java基础是重中之重,实际项目过程中对于这方面需要游刃有余才能去解决更棘手的难点。

二哥的文章还是写的非常好的,要是想理解更深刻一些可以继续精进

Java 8 Optional最佳指南:解决空指针问题的优雅之选 | Java程序员进阶之路

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值