在Java编程中,空指针异常(NullPointerException)是开发者经常遇到的一个“坑”。为了更加优雅地处理可能为null的对象,Java 8引入了Optional类。Optional是一个可以包含也可以不包含非null值的容器对象,它提供了一种更好的方式来处理可能为null的对象,避免直接使用null值导致的空指针异常。
1.基础用法
创建Optional对象
- 使用Optional.of(T value):如果value为null,则抛出NullPointerException。
- 使用Optional.ofNullable(T value):允许value为null。
Optional<String> optionalString1 = Optional.of("Hello, World!");
Optional<String> optionalString2 = Optional.ofNullable(null); // 不抛出异常
获取值
- 使用get():如果Optional对象包含值,则返回该值,否则抛出NoSuchElementException。
- 使用orElse(T other):如果Optional对象包含值,则返回该值,否则返回other。
String result1 = optionalString1.get(); // 返回 "Hello, World!"
String result2 = optionalString2.orElse("Default Value"); // 返回 "Default Value"
检查值是否存在
- 使用isPresent():如果Optional对象包含值,则返回true,否则返回false。
- 使用ifPresent(Consumer consumer):如果Optional对象包含值,则执行给定的操作。
boolean isPresent = optionalString1.isPresent(); // 返回 true
optionalString1.ifPresent(value -> System.out.println(value)); // 输出 "Hello, World!"
2.高阶用法
转换值
- 使用map(Function mapper):如果Optional对象包含值,则对其应用给定的函数,返回包含结果的Optional对象。
Optional<Integer> optionalLength = optionalString1.map(String::length); // 返回 Optional[13]
平坦化Optional
- 使用flatMap(Function> mapper):如果Optional对象包含值,则对其应用给定的函数,并返回结果Optional对象;如果结果为null,则返回一个空的Optional对象。
Optional<String> optionalUpperCase = optionalString1.flatMap(value -> Optional.ofNullable(value.toUpperCase())); // 返回 Optional["HELLO, WORLD!"]
过滤值
- 使用filter(Predicate predicate):如果Optional对象包含的值满足给定的谓词条件,则返回该Optional对象;否则返回一个空的Optional对象。
Optional<String> optionalFiltered = optionalString1.filter(value -> value.contains("World")); // 返回 Optional["Hello, World!"]
Optional<String> optionalFilteredEmpty = optionalString1.filter(value -> value.contains("Java")); // 返回 Optional.empty()
自定义默认值
- 使用orElseThrow(Supplier exceptionSupplier):如果Optional对象不包含值,则抛出由给定的Supplier提供的异常。
try {
String result3 = optionalString2.orElseThrow(() -> new IllegalArgumentException("Value is missing!"));
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage()); // 输出 "Value is missing!"
}
代码示例汇总
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class OptionalExample {
public static void main(String[] args) {
// 基础用法
Optional<String> optionalString1 = Optional.of("Hello, World!");
Optional<String> optionalString2 = Optional.ofNullable(null);
String result1 = optionalString1.get(); // 获取值
String result2 = optionalString2.orElse("Default Value"); // 使用默认值
boolean isPresent = optionalString1.isPresent(); // 检查值是否存在
optionalString1.ifPresent(value -> System.out.println(value)); // 如果存在,执行操作
// 高阶用法
Optional<Integer> optionalLength = optionalString1.map(String::length); // 转换值
Optional<String> optionalUpperCase = optionalString1.flatMap(value -> Optional.ofNullable(value.toUpperCase())); // 平坦化Optional
Optional<String> optionalFiltered = optionalString1.filter(value -> value.contains("World")); // 过滤值
try {
String result3 = optionalString2.orElseThrow(() -> new IllegalArgumentException("Value is missing!")); // 自定义默认值(抛出异常)
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}
3.小结
Optional类是Java 8引入的一个重要特性,它提供了一种更加优雅和安全的方式来处理可能为null的对象。通过合理使用Optional,我们可以有效减少空指针异常的发生,使代码更加健壮和易于维护。希望本文能帮助你更好地理解和应用Optional。