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() 等这样的方法.

 

posted @ 2021-05-30 17:11  nkk  阅读(133)  评论(0编辑  收藏  举报