我有一个类 A,它可以包含类 B 的许多实例,类 B 又可以包含类 C 的许多实例,类 C 可以包含类 D 的许多实例
现在,在 A 类中,我有一个方法 getAllD
。目前,每次调用时都会发生大量迭代,并且会重新创建并返回一个相当大的列表。这效率不高。
我想知道如何才能做得更好。这个问题Combine multiple Collections into a single logical Collection?似乎涉及类似的主题,但我不太确定如何将其应用到我的情况。
非常感谢所有评论!
最佳答案
我会合并Iterables.concat与 Iterables.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/