【问题标题】:Java Stream collect all childrenJava Stream 收集所有孩子
【发布时间】:2016-11-10 23:42:14
【问题描述】:

我想编写一个 Java 8 stream().collect 函数,该函数返回一个 List<T>,其中包含层次结构中节点的所有子节点和子节点。例如 TreeItem<T> getChildren() 和所有孩子的孩子等等,将其减少到一个列表。


顺便说一下,这是我作为通用方法的最终解决方案。非常有效,非常有用。

public static <T> Stream<T> treeStream(T root, boolean includeRoot, Function<T, Stream<? extends T>> nextChildren)
{
    Stream<T> stream = nextChildren.apply(root).flatMap(child -> treeStream(child, true, nextChildren));
    return includeRoot ? Stream.concat(Stream.ofNullable(root), stream) : stream;
}

【问题讨论】:

  • 您能分享一下您的TreeItem 课程吗(或者至少分享一下它的相关方法)?
  • @Mureinik "My" TreeItem 类是 javafx.scene.control.TreeItem。相关方法是getChildren()。

标签: java-8 java-stream hierarchical-data children collectors


【解决方案1】:

您必须使用递归函数来展平树。你在这里有一个例子:http://squirrel.pl/blog/2015/03/04/walking-recursive-data-structures-using-java-8-streams/

【讨论】:

  • 没关系,但递归通常不是一个好主意,因为堆栈可能会溢出。
  • 如果树很深,您可以使用trampolines — 这是一个很好的article in french 来避免堆栈溢出:但是代码变得不那么可读了。
  • 蹦床……我不认识,有趣。
【解决方案2】:

为了避免堆栈溢出,有一种方法可以用堆中的队列替换堆栈。

此解决方案从迭代器​​创建流,该迭代器懒惰地导航保存Queue 中下一个项目的树。

根据队列遍历的类型可以是depth firstbreadth first

class TreeItem {
    Collection<TreeItem> children = new ArrayList<>();
}

Stream<TreeItem> flatten(TreeItem root) {
    Iterator<TreeItem> iterator = new Iterator<TreeItem>() {
        Queue<TreeItem> queue = new LinkedList<>(Collections.singleton(root)); //breadth first
//      Queue<TreeItem> queue = Collections.asLifoQueue(new LinkedList<>(Collections.singleton(root))); //depth first

        @Override public boolean hasNext() {
            return !queue.isEmpty();
        }

        @Override public TreeItem next() {
            TreeItem next = queue.poll();
            queue.addAll(next.children);
            return next;
        }
    };
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
}

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多