掌握 java 8 Optional

3.1 创建Optinoal

  • 创建一个空的Optional Optional empty = Optional.empty();

  • 创建一个非空的Optional ,如果of参数为null则抛出空指针异常

    String str1 = "";
    Optional strOptional = Optional.of(str1);

  • 创建一个可以为空的Optional

    String str1 = null;
    Optional strOptional = Optional.ofNullable(str1);

  • optional.filter(Predicate<? super predicate)接口实现类返回true,返回this,否则或者optional对象是空 则返回 Optional.empty();

    JSONObject jsonObject = new JSONObject();
    JSONObject invoiceStatus = new JSONObject();
    invoiceStatus.put("sdf","sdf");
    jsonObject.put("invoiceStatus",invoiceStatus);
    Optional invoiceStatusJson = Optional.ofNullable(jsonObject.getJSONObject("invoiceStatus"));
    Optional optional = invoiceStatusJson.filter(json -> json.getString("sdf") != null);
    // 源码
    public Optional filter(Predicate<? super T> predicate) {
    Objects.requireNonNull(predicate);
    if (!isPresent())
    return this;
    else
    return predicate.test(value) ? this : empty();
    }

  • map(Function<? super T,? extends U> mapper)&&flatMap(Function<? super T,Optional> mapper)这两个方法很类似,都是返回一个optional,前者自动,后置需要手动创建一个

    Optional sdk = invoiceStatusJson.flatMap(json -> Optional.ofNullable(json.getString("sdk")));
    // 源码
    public Optional flatMap(Function<? super T, Optional> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
    return empty();
    else {
    return Objects.requireNonNull(mapper.apply(value));
    }
    }

    Optional sdk = invoiceStatusJson.map(json -> json.getString("sdk"));
    // 源码
    public Optional map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
    return empty();
    else {
    return Optional.ofNullable(mapper.apply(value));
    }
    }

3.2 取optional对象里面的值

  • get() 如果optional有值则返回,没有抛出异常java.util.NoSuchElementException.

  • orElse(T other) 如果optional有值则返回,没有返回other

  • orElseGet(Supplier<? extends T> other) 如果optional有值则返回,没有返回Supplier函数接口实现类的get方法返回值

  • orElseThrow(Supplier<? extends X> exceptionSupplier) 如果有值返回,没有值抛出Supplier函数接口实现类的get方法返回的值,这个值是Throwable子类

    invoiceStatusJson.orElseThrow(() -> new NullPointerException("sd"));
    // 源码
    public T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
    return value;
    } else {
    throw exceptionSupplier.get();
    }
    }

3.3 判断optional里的值

  • isPresent() 有值返回true

    //源码
    public boolean isPresent() {
    return value != null;
    }

  • ifPresent 有值执行Consumer接口的实现类

    // 源码
    public void ifPresent(Consumer<? super T> consumer) {
    if (value != null)
    consumer.accept(value);
    }

posted @ 2020-09-22 16:23  maoyan  阅读(188)  评论(0编辑  收藏  举报