ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### [Optional 流](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=optional-%e6%b5%81) 假设你的生成器可能产生`null`值,那么当用它来创建流时,你会自然地想到用**Optional**来包装元素。如下是它的样子,代码示例: ~~~ // streams/Signal.java import java.util.*; import java.util.stream.*; import java.util.function.*; public class Signal { private final String msg; public Signal(String msg) { this.msg = msg; } public String getMsg() { return msg; } @Override public String toString() { return "Signal(" + msg + ")"; } static Random rand = new Random(47); public static Signal morse() { switch(rand.nextInt(4)) { case 1: return new Signal("dot"); case 2: return new Signal("dash"); default: return null; } } public static Stream<Optional<Signal>> stream() { return Stream.generate(Signal::morse) .map(signal -> Optional.ofNullable(signal)); } } ~~~ 当我们使用这个流的时候,必须要弄清楚如何解包**Optional**。代码示例: ~~~ // streams/StreamOfOptionals.java import java.util.*; import java.util.stream.*; public class StreamOfOptionals { public static void main(String[] args) { Signal.stream() .limit(10) .forEach(System.out::println); System.out.println(" ---"); Signal.stream() .limit(10) .filter(Optional::isPresent) .map(Optional::get) .forEach(System.out::println); } } ~~~ 输出结果: ~~~ Optional[Signal(dash)] Optional[Signal(dot)] Optional[Signal(dash)] Optional.empty Optional.empty Optional[Signal(dash)] Optional.empty Optional[Signal(dot)] Optional[Signal(dash)] Optional[Signal(dash)] --- Signal(dot) Signal(dot) Signal(dash) Signal(dash) ~~~ 在这里,我们使用`filter()`来保留那些非空**Optional**,然后在`map()`中使用`get()`获取元素。由于每种情况都需要定义“空值”的含义,所以通常我们要为每个应用程序采用不同的方法。