我有内部节点和终端节点的树状结构:
public interface Node { } public class InternalNode implements Node { private Listnodes; } public class TerminalNode implements Node { private String label; }
我现在有一个List
我想要压扁的东西.在这里,展平意味着我想通过其子节点递归替换内部节点,直到所有内部节点都被终端替换.
我想出了这个功能:
private static Listflatten(final List 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
)包装到一个单独的列表中Collections.singletonList(node)
,然后我必须通过再次将该单个列表转换回节点flatMap(List::stream)
.
有没有办法避免这种无用的Collections.singletonList(node)
后续flatMap(List::stream)
终端节点?
1> JB Nizet..:
您可以直接使用flatMap:
private static Streamflatten(final List nodes) { return nodes .stream() .flatMap(node -> { if (node instanceof InternalNode) { return flatten(((InternalNode) node).getNodes()); } return Stream.of((TerminalNode) node); }); }
如果需要List,则只需收集该方法调用的结果即可.
...和条件:`.flatMap(node - > node instanceof InternalNode?flatten(((InternalNode)node).getNodes()):Stream.of((TerminalNode)node))`
- 随机文章
- 热门文章
- 热评文章
- 错误:未找到默认活动,但已声明
- LiquidHaskell与Idris中的运行时"类型术语"
- 小程序开发规范你了解多少
- 一个项目应对各式各样环境-profile完美应付 | 再也不要每套环境改次配置了
- 电脑录屏快捷键是什么?win10自带屏幕录制在哪
- 如何使用TCustomTransparentControl创建透明控件?
- 2022年全球及中国预压接引线行业头部企业市场占有率及排名调研报告
- 2022-2028全球汽车EDR行业调研及趋势分析报告