如何获取实际流以便从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中包含一个流是否正确?由于流应该始终不为空(如果为空),是否不需要检查?
在这里,你根本不需要使用
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,您可以使用
==
检查引用是否相等。Optional.ofNullable(id)
.stream() // Java 9
.flatMap(this::loadAllById)
.filter(...)