面试题答案
一键面试Optional类基本用法
Optional
类是Java 8引入的,用于解决空指针异常(NullPointerException
)问题。它本质上是一个容器类,可能包含也可能不包含非空值。
常用方法
- 创建Optional实例
Optional.of(T value)
:创建一个包含指定非空值的Optional
实例。如果value
为null
,会抛出NullPointerException
。Optional.ofNullable(T value)
:创建一个可能包含null
值的Optional
实例。如果value
为null
,则创建的Optional
实例不包含值。Optional.empty()
:创建一个不包含值的Optional
实例。
- 检查值是否存在
boolean isPresent()
:判断Optional
是否包含值。
- 获取值
T get()
:如果Optional
包含值,则返回该值,否则抛出NoSuchElementException
。T orElse(T other)
:如果Optional
包含值,则返回该值,否则返回指定的other
值。T orElseGet(Supplier<? extends T> other)
:如果Optional
包含值,则返回该值,否则调用Supplier
获取并返回一个值。T orElseThrow(Supplier<? extends X> exceptionSupplier)
:如果Optional
包含值,则返回该值,否则抛出由exceptionSupplier
提供的异常。
- 处理值
void ifPresent(Consumer<? super T> consumer)
:如果Optional
包含值,则对该值执行Consumer
中的操作。
示例代码
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
// 假设这是可能为空的对象
String name = null;
// 使用Optional.ofNullable创建Optional实例
Optional<String> optionalName = Optional.ofNullable(name);
// 1. 使用orElse方法提供默认值
String result1 = optionalName.orElse("default name");
System.out.println(result1);
// 2. 使用orElseGet方法根据Supplier提供默认值
String result2 = optionalName.orElseGet(() -> "default name from Supplier");
System.out.println(result2);
// 3. 使用ifPresent方法处理值
optionalName.ifPresent(n -> System.out.println("The name is: " + n));
// 4. 使用orElseThrow方法在值不存在时抛出异常
try {
String result3 = optionalName.orElseThrow(() -> new RuntimeException("Name is not present"));
System.out.println(result3);
} catch (RuntimeException e) {
System.out.println(e.getMessage());
}
}
}
在上述示例中,通过Optional
类的不同方法,优雅地处理了可能为空的name
对象,避免了空指针异常。