【问题标题】:Java - Retrieve stream from Optional<Stream>Java - 从 Optional<Stream> 中检索流
【发布时间】:2022-07-07 19:13:26
【问题描述】:

如何获取实际流以便从 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 中有一个流是否正确?由于流不应始终为空(如果为空),是否不需要检查?

提前感谢您的回答????

【问题讨论】:

  • 是的,您正在混合使用两个 API:Optional 和 Stream。试试.map(this:loadAllById).orElseGet(Stream::empty).filter(...)filter 现在是 Stream 的,而不是 Optional 的。
  • 普遍的共识似乎是像集合或流这样的容器元素最好表示为空元素,而不是包裹在Optional中。
  • 非常感谢你们,你已经澄清了我所有的疑惑

标签: java java-8 java-stream optional


【解决方案1】:

在这里,您根本不需要使用Optinal

Optional 不是旨在执行 null-checks 和 Optional.ofNullable(id) 是对 optional 的滥用(请参阅 Should Optional.ofNullable() be used for null check?)。改为使用显式空检查。

空流可以表示没有数据,你不需要一个空的可选项。使您的方法loadAllById() 返回一个流而不是可选流。使用可选项包装流不是正确使用可选项(@MC Emperor 已经在 cmets 中提到过)。

这就是您的代码的样子:

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

如果status 是一个枚举,您可以使用== 检查引用是否相等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2021-07-21
    • 2014-05-08
    相关资源
    最近更新 更多