从可选中检索流<Stream>

问题描述 投票:0回答:2

如何获取实际流以便从Optional中过滤或映射方法? 比如说

Optional.ofNullable(id)
        .map(this:loadAllById) // method loadAllById return a stream (now is wrapped in Optional<Stream>)
        .filter(obj -> obj.status) // here i have no access to object in stream but to the full stream 

由此也产生了疑问。在Optional中包含一个流是否正确?由于流应该始终不为空(如果为空),是否不需要检查?

java java-8 java-stream option-type
2个回答
6
投票

在这里,你根本不需要使用

Optinal

Optional not 旨在执行

null
检查,而
Optional.ofNullable(id)
是对Optional 的滥用(参见 Optional.ofNullable() 是否应该用于 null 检查?)。请改用显式的空检查。

“空流”可以表示没有数据,您不需要为此使用空选项。让你的方法loadAllById()返回一个流

Stream<Foo>
而不是可选的流
Optional<Stream<Foo>>
。用可选值包装流并不是可选值的正确用法(
因为@MC Empire
在评论中已经提到过)。 这就是你的代码的样子:

public Stream<Foo> getFoosById(Long id, Status status) { if (id == null) { return Stream.empty(); } return loadAllById(id).filter(foo -> foo.getStatus().equals(status)); }

如果 
status

是一个

enum
,您可以使用 == 检查引用是否相等。
    


0
投票

Optional.ofNullable(id) .stream() // Java 9 .flatMap(this::loadAllById) .filter(...)

© www.soinside.com 2019 - 2024. All rights reserved.