JAVA8 Optional类记录
Optional
属于 java.util 包,是一个工具类。
具体是判断是否为null,优化空指针的写法,更为优雅的写法。
API
1 是否存在
ofNullable 空返回empty
of 空返回异常
最初始的操作,都是判空。
区别:
- ofNullable 为空返回empty
- of为空 返回异常
of 源码:
ofNullable 源码:
实验:
2 判空操作
isPresent 返回布尔值
ifPresent(Consumer<? super T> consumer) 返回操作
orElse(T other) 返回操作
orElseGet(Supplier<? extends T> other) 返回操作
orElseThrow(Supplier<? extends X> exceptionSupplier) 返回异常
一般判空都是要进行下一步操作,三个常用的or和两个Present。
像往常一样的判空操作,就能优雅的表达出来。
2.1 ispresent
实验:
2.2 ifpresent 需要方法操作可以用这个
2.2 orElseGet 与 orElse
实验:
结果:
orElse orelseGet 区别
1 不管是否为null ,orElse 都会调用方法 但是某些时候方法没生效
方法沒生效是因为:
不为空返回 value 原来的,空就返回 other ,就是 管不管为不为空,都会执行方法,再根据value在取值。
2 orelseGet 只在Null 的 才会调方法
原理:orElse和orElseGet作用都是返回缺省值,并且无论present是否为空它们肯定是会被调用的,他们的关键区别在于一个是饿汉式,一个是懒汉式。orElse是无论present是否为空,缺省值都会被加载到内存(在高并发下慎用)。orElseGet是仅当present为空时,将缺省值加载到内存。
所以一般情况下,用orwlseGet会更好。
2.3 这些应该与stream 的api类似吧 (以后在做验证)
filter(Predicate<? super T> predicate) 过滤
map(Function<? super T, ? extends U> mapper) map
flatMap(Function<? super T, Optional<U>> mapper)