这个类是一个 wrapper,用来保存想要的结果或者没结果
为了让自己写的类更好的与 Stream
合作,可能需要类去实现正常参数入,Optional 包着出的方法模式
Getting an Optional Value
对于没结果常用 orElse-
后面可能接或不接实现各种各样的操作
Consuming an Optional Value
前面是获取结果,这边是直接拿来用,可以压缩步骤
用 isPresent(lambda)
Pipelining Optional Values
把他当 Stream 用 map
, filter
等类似操作
因此可以有
Optional<String> transformed = optionalString
.filter(s -> s.length() >= 8)
.map(String::toUpperCase);
就是对 Optional 再预处理一波,再做事情
or
就是当 Optional 没东西的时候的替代物。对比 orElse
,一个是直接拿出来,一个是放进去,表现为返回类型不同
map vs. flatMap
可以把
Optional
当作是只有一个元素的Stream
在 Stream 中,会取流中的元素,生成新流然后去掉流的包装
类似的,在 Optional 中,如果有两个函数,他们要的不是 Optional,但是返回的却是,用这个可以类似的实现。注意思考如果不用 flat,返回的会是 Optional 包 Optional
Creating Optional Values
Optional.of
Turning an Optional into a Stream
利用 Stream
的 flatMap
考虑这样的情形,你有一个流,里头全是质量参差不齐的 Optional
,如何最快的找出来呢?filter
+ map
就不 elegant 了!
Stream<User> users = ids.map(Users::lookup).flatMap(Optional::stream);
首先 Optional
在很多情形就是可以理解为 0 或 1 个元素的 Stream
,所以有一个 stream
方法真的去做了这件事很好理解吧?然后 flatMap
完美的丢掉了空结果
但是前提是 Optional
上述这么些非常美好,但前提是方法返回的不一定是
Optional
,更多的情况,包括我们自己写,总是有就有,没有就null
那么解决的关键在哪呢?其实归根结底,==只要
faltMap
里的方法可以正确的出空或不空的Stream
就行了==Stream<User> users = ids.map (Users::classicLookup).flatMap (Stream::ofNullable);