这个类是一个 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

利用 StreamflatMap

考虑这样的情形,你有一个流,里头全是质量参差不齐的 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);