10. Java8-Optional 简介

x33g5p2x  于2021-12-18 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(266)

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
publicOptionalmap(Function<? super T, ? extends U> mapper)可返回optional 包含对象里的属性, 也可根据不同条件来返回不同值
publicOptionalflatMap(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
    }

}

相关文章