gpt4 book ai didi

java - 使用流递归展平列表

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:37 25 4
gpt4 key购买 nike

我有内部节点和终端节点的树状结构:

public interface Node
{
}

public class InternalNode implements Node {
private List<Node> nodes;
}

public class TerminalNode implements Node {
private String label;
}

我现在有一个 List<Node>我想压平。在这里,扁平化意味着我想用它的 child 递归地替换一个内部节点,直到所有内部节点都被终端替换。

我想出了这个函数:

private static List<Node> flatten(final List<Node> nodes) {
return nodes
.stream()
.map(node -> {
if (node instanceof InternalNode) {
return flatten(((InternalNode) node).getNodes());
}
return Collections.singletonList(node);
})
.flatMap(List::stream)
.collect(Collectors.toList());
}

这似乎完成了它的工作。但是,我想知道是否有更好的实现方式。我首先必须包装一个 TerminalNode 似乎很奇怪通过 List<TerminalNode> 进入单例列表(类型为 Collections.singletonList(node) )然后我必须通过 flatMap(List::stream) 再次将该单例列表转换回节点.

有没有办法避免这种无用的Collections.singletonList(node)其次是 flatMap(List::stream)对于终端节点?

最佳答案

你可以直接使用 flatMap:

private static Stream<TerminalNode> flatten(final List<Node> nodes) {
return nodes
.stream()
.flatMap(node -> {
if (node instanceof InternalNode) {
return flatten(((InternalNode) node).getNodes());
}
return Stream.of((TerminalNode) node);
});
}

如果你想要一个列表,你可以只收集那个方法调用的结果。

关于java - 使用流递归展平列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52670243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com