登陆

使用流递归地压缩列表

admin 2022-12-02 4人围观 ,发现0个评论

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

public interface Node { }  public class InternalNode implements Node {     private List nodes; }  public class TerminalNode implements Node {     private String label; } 

我现在有一个List我想要压扁的东西.在这里,展平意味着我想通过其子节点递归替换内部节点,直到所有内部节点都被终端替换.

我想出了这个功能:

private static List flatten(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 Stream flatten(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))`
请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP