如何遍历可选的嵌套列表?

How to traverse a nested list in an optional?

我有一个对象 node,它有一个 getNodes() 方法,returns 一个列表,只有当 node 不是 null.

我尝试在我认为可以映射列表流并遍历它的地方执行以下操作,但实际情况是它尝试对流对象而不是列表内容执行筛选。

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

    // operation on filtered nodes.
    ....

}

在您的代码中:

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

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

Stream.of(node.getNodes))

相反,要获取节点流,然后您可以在其中过滤节点,请使用:

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

与引入可选语句相比,使用简单的 if not null 语句可能更好。它使代码更具可读性并减少开销。

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

此外,您正在从 void 方法返回。

在最糟糕的实施选择中, 放置一个 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(...)