zoukankan      html  css  js  c++  java
  • Optional使用

    借鉴

    https://blog.csdn.net/L_Sail/article/details/78868673?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162236063816780269865182%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162236063816780269865182&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-78868673.pc_search_result_cache&utm_term=java8++optional&spm=1018.2226.3001.4187

    大概意思就是用了Optiona可以不用多余的判断是否为null

    of

    //调用工厂方法创建Optional实例
    Optional<String> name = Optional.of("Sanaulla");
    //传入参数为null,抛出NullPointerException.
    Optional<String> someNull = Optional.of(null);

    ofNullable

    和of的区别就是可以传入null.返回一个空的Optional对象   下面代码的效果是一样的

     Optional<String> name = Optional.ofNullable(null);
            Optional<String> name2= Optional.empty();

    isPresent

    就是判断Optional对象是否为空,如果不为空 用get 可以获取到值,如果为空,用get获取值会报错 。这种方式和原来的方式判读空没啥区别 基本不用。

     public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable("fs");
            Optional<String> name2= Optional.empty();
            if (name.isPresent()){
                System.out.println(name.get());
            }
    
        }

    ifPresent

    。其实主要就是可以直接判断空,如果不为空就走下面的逻辑,如果为空就下面的逻辑不走。

    存在才对他做点什么。 。注意我理解它功能主要是判断下,里面具体逻辑的值s, 改变后对Option对象的值没有效果的。

    
    
    public static void main(String[] args) {
    Optional<String> name = Optional.ofNullable("fs");
    Optional<String> name2= Optional.empty();
    name.ifPresent(s->{
    s=s+"f";
    System.out.println(name.get()); //输出fs
    System.out.println(s); //输出fsf
    });
    System.out.println(name); //输出fs
    }
     
    public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable(null);
            name.ifPresent(System.out::println);
            name.ifPresent(s->{
                s=s+"f";
                System.out.println(name.get());
                System.out.println(s);
            });
        }

     

    orElse. 

    有值就返回值,为空就返回传进去的。

    public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable("fs");
           System.out.println(name.orElse("hh")); ; //输出fs
        }

    orElseGet

    和OrElse类似,但他可以接受Lambda表达式,如果Optional 为空就输出传入的lambda值,就可以调用函数了

     public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable(null);
           System.out.println(name.orElseGet(()->"String")); ; //输出String
        }

    orElseThrow

    //tod不太懂。大概是没有值跑异常

    map

    就是可以对值就行一个处理。如果有值 就把处理好的值返回,如果没值就返回一个空的Optional对象。 具体写的时候map是可以无限级联的,比原来的一直if判断会好

     public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable("fs");
            Optional<String> ma= name.map((value)->value.toUpperCase());
            System.out.println(ma.orElse("No value found"));  //输出FS
        }
    public static void main(String[] args) {
            People people =new People();
            Optional<People> name = Optional.ofNullable(people);
            Optional<String> ma= name.map((value)->value.getName()).map(value->value.toUpperCase());
            System.out.println(ma.orElse("No value found"));  //输出FS
        }

    flatMap

    和上面map类似,区别就是传入的参数类型必须是Optional类型 ,还不知道有什么用。//todo

    public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable("fs");
            Optional<String> ma= name.flatMap(value->Optional.of(value.toUpperCase()));
            System.out.println(ma.orElse("No value found"));  //输出FS
        }

    filter

    就是对值进行一个判断 如果ture就返回正常值,如果flase就返回空的Optional

    public static void main(String[] args) {
            Optional<String> name = Optional.ofNullable("fs");
            Optional<String> ma= name.filter((value)->value.equals("fss"));
            System.out.println(ma.orElse("No value found"));  //No value found"
        }

    具体我们该怎么使用

    isPresent() 与 obj != null 无任何分别, 我们的生活依然在步步惊心. 而没有 isPresent() 作铺垫的 get() 调用在 IntelliJ IDEA 中会收到告警。 这两个好像才是没啥用

    所以 Optional 中我们真正可依赖的应该是除了 isPresent() 和 get() 的其他方法:  可以看下上面的博客

    - public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
    - public T orElse(T other)
    - public T orElseGet(Supplier<? extends T> other)
    - public void ifPresent(Consumer<? super T> consumer)
    - public Optional<T> filter(Predicate<? super T> predicate)
    - public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
    - public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

    小结
    使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等这样的方法.

  • 相关阅读:
    P1007 独木桥
    P1789 【Mc生存】插火把
    P2658 汽车拉力比赛
    1959 拔河比赛
    P1936 水晶灯火灵
    websocket
    瀑布流布局
    Router
    图片占位
    单位
  • 原文地址:https://www.cnblogs.com/ningkuan/p/14828390.html
Copyright © 2011-2022 走看看