【问题标题】:How to traverse a nested list in an optional?如何遍历可选中的嵌套列表?
【发布时间】:2020-03-27 15:56:30
【问题描述】:

我有一个对象node,它有一个返回列表的getNodes() 方法,并且我只想在node 不是null 时遍历这个列表。

我尝试执行以下操作,我认为我可以映射列表的流并遍历它,但结果是它尝试对 Stream 对象而不是列表的内容执行过滤器。

public void updateNode(Node node) {
    List<Node> nodes = Optional.ofNullable(node)
                   .map(node -> Stream.of(node.getNodes))
                   .filter().......orElse()

    // operation on filtered nodes.
    ....

}

【问题讨论】:

  • 你为什么要在 void 方法中返回一些东西?应该返回什么方法?
  • if (null == node) 返回;它不适合你吗?

标签: java java-stream optional


【解决方案1】:

您最好只使用一个简单的 if not null 语句而不是引入一个可选语句。它使代码更具可读性并减少开销。

if (node != null) {
    node.getNodes().stream.filter(...
}

另外,你是从一个 void 方法返回的。

【讨论】:

    【解决方案2】:

    在最糟糕的实现选择中,对correct answer here 放置一个null 进行检查有以下可用替代方案:

    Optional.ofNullable(node)
            .map(Node::getNodes)
            .orElse(Collections.emptyList())
            .stream() // Stream of nodes
            .filter(...)
    

    或使用 Java-9 +

    Stream.ofNullable(node)
            .flatMap(nd -> nd.getNodes().stream())
            .filter(...)
    

    【讨论】:

    • 非常感谢,这正是我想要的。这是两者中最差的实现吗(在 if 语句中进行空检查)?
    【解决方案3】:

    在您的代码中:

     Optional.ofNullable(node).map(node -> Stream.of(node.getNodes))
    

    这会创建单个项目的流:节点列表本身。

    Stream.of(node.getNodes))
    

    取而代之的是,要获取节点流,然后您可以在其中过滤节点,请使用:

    node.getNodes().stream().filter(... 
    

    【讨论】:

    • Stream.of(node.getNodes)) 会为 node==null 抛出空指针异常
    • @Naman Optional.ofNullable(node) 在 node == null 时返回 Optional.empty。 OP 的代码不会调用映射器函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2012-11-11
    • 2020-11-13
    • 2015-05-16
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多