为了账号安全,请及时绑定邮箱和手机立即绑定

使用流递归展平列表

使用流递归展平列表

缥缈止盈 2021-10-28 15:50:35
我有内部节点和终端节点的树状结构: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);

            });

}

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


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信