Dar*_*iva 2 java java-stream option-type
假设我有一个Optional包含Stream:
Optional<Stream<Integer>> optionalStream = Optional.of(Stream.of(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)
现在我需要提取它Stream本身。如果Optional为空,您想要获得一个空的 Stream。
我正在寻找类似的东西,flatStream()可以一步执行转换。我怎样才能做到这一点?
我目前的尝试:
Stream<Integer> stream = optionalStream.stream().flatMap(Function.identity());
Run Code Online (Sandbox Code Playgroud)
在我的真实场景中,我有这样的东西,它给了我一个Stream<Optional<Foo>>:
stream.findFirst().map(e -> e.getChildren())
Run Code Online (Sandbox Code Playgroud)
Stream.empty()Stream用 包裹a是没有意义的Optional。
AnOptional允许与方法调用的结果安全地交互,这可能不会产生数据。而空Optional则代表数据不存在的情况。
AStream也可以为空,它完美地表示数据的缺失,无需打包到Optional.
用作Stream.empty()方法的返回值。
您可能还想检查这些参考资料:
Optional.stream()解决问题的最好方法就是消除问题。
答案的精神保持不变:不创建 an Optional<Stream<T>>,就没有必要处理它。
Java 9Optional.stream()来拯救你了。stream()在之后应用findFirst(),您将得到一个包含由 捕获的值的单例流findFirst(),或者一个空流。然后您可以执行您需要的任何转换。
所以,而不是这个:
stream.findFirst().map(e -> e.getChildren())
Run Code Online (Sandbox Code Playgroud)
请执行下列操作:
stream.findFirst().stream().flatMap(Foo::getChildren)
Run Code Online (Sandbox Code Playgroud)
或者,按照@Holger的建议,findFirt()您可以应用limit(1)并继续链接流操作。此方法适用于 JDK 8。
stream.limit(1).flatMap(Foo::getChildren)
Run Code Online (Sandbox Code Playgroud)