是什么
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基础是重中之重,实际项目过程中对于这方面需要游刃有余才能去解决更棘手的难点。
二哥的文章还是写的非常好的,要是想理解更深刻一些可以继续精进