简介
Optional 是 Java 8 引入的一个容器对象,主要用于表示可能存在或不存在的值。它用于避免 null 值带来的空指针异常(NullPointerException),使代码更加清晰和安全。
用法:
1. 创建 Optional 对象
- 使用 Optional.of():用于创建一个非空的 Optional 对象。
Optional<String> optionalValue = Optional.of("Hello");
- 使用 Optional.ofNullable():可以创建一个可能为 null 的 Optional 对象。
Optional<String> optionalValue = Optional.ofNullable(null); // 允许为 null
- 使用 Optional.empty():创建一个为空的 Optional 对象。
Optional<String> emptyOptional = Optional.empty();
2. 检查值的存在性
- 使用 isPresent():检查 Optional 中是否有值。
if (optionalValue.isPresent()) {
System.out.println(optionalValue.get());
}
- 使用 ifPresent():如果值存在,则执行给定的操作。
optionalValue.ifPresent(value -> System.out.println(value));
3. 获取值
- 使用 get():获取 Optional 中的值,如果值不存在,会抛出 NoSuchElementException。
String value = optionalValue.get();
- 使用 orElse():如果值存在,返回该值;否则返回指定的默认值。
String value = optionalValue.orElse("Default Value");
- 使用 orElseGet():如果值不存在,返回由 Supplier 生成的值。
String value = optionalValue.orElseGet(() -> "Generated Value");
- 使用 orElseThrow():如果值不存在,抛出指定的异常。
String value = optionalValue.orElseThrow(() -> new IllegalArgumentException("Value is absent"));
4. 转换值
- 使用 map():对 Optional 中的值进行转换,如果值存在,返回转换后的结果
Optional<Integer> lengthOptional = optionalValue.map(String::length);
- 使用 flatMap():与 map() 类似,但用于返回一个 Optional 的情况,避免嵌套的 Optional。
Optional<Integer> lengthOptional = optionalValue.flatMap(value -> Optional.of(value.length()));
5. 过滤值
- 使用 filter():根据条件过滤 Optional 中的值,如果条件不满足,则返回一个空的 Optional。
Optional<String> filtered = optionalValue.filter(value -> value.startsWith("H"));
DEMO
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optionalValue = Optional.ofNullable("Hello, World!");
// 检查值是否存在
optionalValue.ifPresent(System.out::println);
// 获取值或默认值
String value = optionalValue.orElse("Default Value");
System.out.println(value);
// 使用 map 转换
Optional<Integer> lengthOptional = optionalValue.map(String::length);
lengthOptional.ifPresent(length -> System.out.println("Length: " + length));
}
}
原理
Optional类
执行构造函数Optional(T value) 调用 Object.requireNonNull 如果为空就报 npe 不为空则返回value
empty()
就是返回EMPTY对象 Optional类内部还维护一个value为null的对象
ofNullable
内部 return value == null ? empty() : of (value) 也就是 value不为空时 返回value 为空时返回null对象
orElse
orElse(T other),orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)
三个函都是在构造函数传入的value值为null时,进行调用的
orElse 用来直接赋值
orElseGet 用来调用为空时调用的函数
orElseThrow 为空时抛一个异常出去
map
map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional> mapper)
这两个函数做的是转换值的操作。
首先解释一下 Function 它是一个函数接口,它可以用来接受lambda表达式
函数接受一个参数并返回结果,它包含一种方法 apply() => R apply(T t) 其中 R为结果 T是函数参数
- isPresent()和ifPresent(Consumer<? super T> consumer)
Present即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作。 - =>filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
eg: Optional user = Optional.ofNullable(user).filter(u->u.getName.length<6)
如上所示,如果user的name的长度是小于6的,则返回。如果是大于6的,则返回一个EMPTY对象。

1103

被折叠的 条评论
为什么被折叠?



