版权声明:您的关注和评论, 是笔者持续创作最大的动力^_^ https://blog.csdn.net/zongf0504/article/details/90057677
Java8 新增了一个容器类 Optional, 用于表示一个值存在或不存在, 原来只用null 表示值不存在. Optional 的目的是避免空指针异常, 但是笔者并没有如何才能用好它
1. 常用API
API 签名 | 方法描述 |
---|---|
public static Optional of(T value) | 创建实例, 参数不能为null |
public static Optional ofNullable(T value) | 创建实例,参数可为null.参数为null, 创建空实例 |
public static Optional empty() | 创建空的optional实例 |
public void ifPresent(Consumer<? super T> consumer) | 判断optional 是否包含对象 |
public T orElse(T other) | 获取optional 包含对象或返回默认对象 |
public T orElseGet(Supplier<? extends T> other) | 和orElse 方法类似, 只是接收函数式接口 |
public T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X | |
public Optional map(Function<? super T, ? extends U> mapper) | 可返回optional 包含对象里的属性, 也可根据不同条件来返回不同值 |
public Optional flatMap(Function<? super T, Optional> mapper) | 和map 类似, 只是函数式接口的返回值也需要是optional |
2. API 示例
public class TestOptional {
// 使用of 方法创建一个Optional 实例, 但是方法参数不能为空
@Test
public void test_of(){
Optional<String> op = Optional.of("zhangsan");
System.out.println(op.get());
}
@Test
public void test_ofNullable(){
Optional nullOp = Optional.ofNullable(null);
System.out.println(nullOp); // Optional.empty
Optional op = Optional.ofNullable("zhangsan");
System.out.println(op); // Optional[zhangsan]
}
@Test
public void test_empty() {
Optional op = Optional.empty();
System.out.println("optional 是否包含对象:" + op.isPresent()); // optional 是否包含对象:false
}
// 判断optional 是否包含对象, 包含返回true, 否则返回false
@Test
public void test_isPresent(){
Optional op = Optional.empty();
System.out.println(op.isPresent()); // false
Optional op2 = Optional.of("zhangsan");
System.out.println(op2.isPresent()); //true
}
// 如果optional 包含值, 则返回值; 否则返回设置的默认值.
@Test
public void test_orElse(){
Optional op = Optional.empty();
System.out.println(op.orElse("lisi")); // lisi
Optional op2 = Optional.of("zhangsan");
System.out.println(op2.orElse("lisi")); // zhangsan
}
// 接收供给型参数,返回默认值
@Test
public void test_orElseGet(){
Optional op = Optional.empty();
System.out.println(op.orElseGet(Employee::new));
}
// 接收函数式接口, 可以返回optioanl 包裹对象的属性, 可以根据条件来返回不同的值
@Test
public void test_map(){
Optional<Employee> employee = Optional.of(new Employee(101, "zhangsan", "Man", 20));
Optional<String> op = employee.map((emp -> emp.getName()));
System.out.println(op.get()); // zhangsan
}
// 和map() 类似, 只是函数式接口返回的也是Optional
@Test
public void test_flatMap(){
Optional<Employee> employee = Optional.of(new Employee(101, "zhangsan", "Man", 20));
Optional<String> op = employee.flatMap((emp -> Optional.of(emp.getName())));
System.out.println(op.get()); //zhangsan
}
}