我有内部节点和终端节点的树状结构:
public interface Node
{
}
public class InternalNode implements Node {
private List<Node> nodes;
}
public class TerminalNode implements Node {
private String label;
}
我现在有一个List<Node>我想压平的。在这里,展平意味着我想用它的孩子递归地替换一个内部节点,直到所有内部节点都被终端替换。
我想出了这个功能:
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());
}
这似乎完成了它的工作。但是,我想知道是否有更好的实现方式。我首先必须将 a 包装TerminalNode成一个单例列表(类型List<TerminalNode>) via Collections.singletonList(node),然后我必须再次将该单例列表转换回节点,这似乎很奇怪flatMap(List::stream)。
有没有办法避免这种无用的情况,Collections.singletonList(node)然后flatMap(List::stream)是终端节点?
慕工程0101907
相关分类