java - 实时查看...等中包含的集合中包含的集合

标签 java collections guava

我有一个类 A,它可以包含类 B 的许多实例,类 B 又可以包含类 C 的许多实例,类 C 可以包含类 D 的许多实例

现在,在 A 类中,我有一个方法 getAllD。目前,每次调用时都会发生大量迭代,并且会重新创建并返回一个相当大的列表。这效率不高。

我想知道如何才能做得更好。这个问题Combine multiple Collections into a single logical Collection?似乎涉及类似的主题,但我不太确定如何将其应用到我的情况。

非常感谢所有评论!

最佳答案

我会合并Iterables.concatIterables.transform获取 Ds 的实时 View :

public class A {
    private Collection<B> bs;

    /**
     * @return a live concatenated view of the Ds contained in the Cs
     *         contained in the Bs contained in this A.
     */
    public Iterable<D> getDs() {
        Iterable<C> cs = Iterables.concat(Iterables.transform(bs, BToCsFunction.INSTANCE));
        Iterable<D> ds = Iterables.concat(Iterables.transform(cs, CToDsFunction.INSTANCE));
        return ds;
    }

    private enum BToCsFunction implements Function<B, Collection<C>> {
        INSTANCE;

        @Override
        public Collection<C> apply(B b) {
            return b.getCs();
        }
    }

    private enum CToDsFunction implements Function<C, Collection<D>> {
        INSTANCE;

        @Override
        public Collection<D> apply(C c) {
            return c.getDs();
        }
    }
}


public class B {
    private Collection<C> cs;

    public Collection<C> getCs() {
        return cs;
    }
}

public class C {
    private Collection<D> ds;

    public Collection<D> getDs() {
        return ds;
    }
}

如果您的目标只是迭代 D,并且您并不真正需要集合 View ,那么这种方法非常有效。它避免了大型临时集合的实例化。

关于java - 实时查看...等中包含的集合中包含的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6024084/

相关文章:

java - 处理 Mono Inside Flux 平面图

java - 在使用枚举之前检查有效的枚举值

集合中的 Java 过滤

functional-programming - 使用多图收集器收集线

java - Guava: Iterables.frequency(Iterable<T>, Predicate<T>)

java - 在 Futures.transform 中,使用 Function 和 AsyncFunction 有什么区别

java - 如何重用 HttpUrlConnection?

java - Java 中的 if(变量 == [集合中的任何项目])

java - HashSet contains() 方法

java - wait总是需要notify才能工作吗?