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