我有内部节点和终端节点的树状结构: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)是终端节点?
1 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
你可以直接使用 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);
});
}
如果你想要一个列表,你可以只收集该方法调用的结果。
添加回答
举报
0/150
提交
取消