📅  最后修改于: 2023-12-03 15:31:28.255000             🧑  作者: Mango
Java 8 引入了一个新的类 Optional
,它允许我们在某些情况下不返回 null 值,并且提供了一些有用的方法来处理这些可选值。
Optional 类是一个容器对象,它可能包含一个非 null 值或者什么都不包含。它是一个 final 类,不能被继承,并且它提供了大量的方法来处理容器中的数据。
可以使用静态工厂方法来创建 Optional 对象:
Optional<String> empty = Optional.empty(); // 创建一个空的 Optional 对象
Optional<String> ofNullable = Optional.ofNullable("hello"); // 创建一个包含非 null 值的 Optional 对象
Optional<String> of = Optional.of("world"); // 创建一个包含非 null 值的 Optional 对象,如果参数为 null,则会抛出 NullPointerException 异常
可以使用 isPresent()
方法来检查 Optional 对象是否包含一个非 null 值。如果 Optional 包含一个值,则返回 true,否则返回 false。
Optional<String> optional = Optional.of("hello");
if (optional.isPresent()) {
String value = optional.get();
System.out.println(value); // "hello"
}
也可以使用 ifPresent()
方法来访问 Optional 对象的值,如果 Optional 包含一个非 null 值,则会执行传递的 Lambda 表达式。
Optional<String> optional = Optional.of("hello");
optional.ifPresent(v -> System.out.println(v)); // "hello"
另外,也可以通过 orElse()
或 orElseGet()
方法来获取 Optional 对象的值。如果 Optional 对象包含一个非 null 值,则返回该值,否则返回传递的默认值或者调用传递的 Supplier 生成的默认值。
Optional<String> optional = Optional.ofNullable(null);
String value1 = optional.orElse("world"); // "world"
String value2 = optional.orElseGet(() -> "world"); // "world"
可以使用 map()
或 flatMap()
方法来转换 Optional 对象的值。如果 Optional 对象包含一个非 null 值,则会执行传递的 Lambda 表达式,并返回一个包含转换结果的 Optional 对象。如果 Optional 对象包含一个 null 值,则返回一个空的 Optional 对象。
Optional<String> optional = Optional.of("hello");
Optional<Integer> length = optional.map(String::length); // Optional[5]
Optional<Integer> emptyLength = Optional.ofNullable(null).map(String::length); // Optional.empty()
flatMap()
方法与 map()
类似,但是它的结果必须是一个 Optional 对象。
Optional<String> optional = Optional.of("hello");
Optional<Integer> length = optional.flatMap(s -> Optional.of(s.length())); // Optional[5]
Optional 类是一个非常有用的类,它可以帮助我们更好地处理 null 值,避免空指针异常,并提供了一些有用的方法来处理可选值。在编写 Java 8 代码时,建议尽可能地使用 Optional 类来编写更安全和可读性更高的代码。