如果您需要获取所有 Boos 并保持 Boos 分组(即属于某些 Foo 的 Boos),那么我会说最好的方法是返回一个查看BigClass中包含的所有Boos,无论它们属于哪个Foo。
为此,您可以使用Google Guava Iterables 或Java 8 Stream.flatMap(),具体取决于您的Java 版本。
使用谷歌番石榴:
class BigClass {
List<Foo> foos = new LinkedList<Foo>();
public Iterable<Boo> allBoos() {
return Iterables.concat(this.foos);
}
}
class Boo {
final int a;
Boo(int a) {
this.a = a;
}
@Override
public String toString() {
return String.valueOf(this.a);
}
}
class Foo
implements Iterable<Boo> {
List<Boo> boos = new LinkedList<Boo>();
@Override
public Iterator<Boo> iterator() {
return this.boos.iterator();
}
}
public class Sample {
public static void main(String[] args) {
Boo b1 = new Boo(1);
Boo b3 = new Boo(3);
Boo b5 = new Boo(5);
Boo b2 = new Boo(2);
Boo b4 = new Boo(4);
Boo b6 = new Boo(6);
Foo odd = new Foo();
odd.boos.addAll(Arrays.asList(b1, b3, b5));
Foo even = new Foo();
even.boos.addAll(Arrays.asList(b2, b4, b6));
BigClass b = new BigClass();
b.foos.add(odd);
b.foos.add(even);
System.out.println(b.allBoos()); // [1, 3, 5, 2, 4, 6]
}
}
这种方法的最佳之处在于 Guava 返回的 Iterable 是 lazy,这意味着不会创建新的集合或列表并填充任何元素。相反,返回的Iterable 是一个视图,其Iterator 消耗第一个Iterable 中的元素,当用尽时,“跳转”到下一个Iterable 并消耗它的元素,然后“跳转”到下一个,以此类推,直到最后一个 Iterable 的最后一个元素被消耗完。
使用 Java 8:
class BigClass {
List<Foo> foos = new LinkedList<Foo>();
public Iterable<Boo> allBoos() {
Stream<Boo> s = this.foos.stream().flatMap(
f -> f.getBoos().stream());
return s::iterator;
}
}
class Boo {
final int a;
Boo(int a) {
this.a = a;
}
@Override
public String toString() {
return String.valueOf(this.a);
}
}
class Foo {
List<Boo> boos = new LinkedList<Boo>();
public List<Boo> getBoos() {
return this.boos;
}
}
public class Sample {
public static void main(String[] args) {
Boo b1 = new Boo(1);
Boo b3 = new Boo(3);
Boo b5 = new Boo(5);
Boo b2 = new Boo(2);
Boo b4 = new Boo(4);
Boo b6 = new Boo(6);
Foo odd = new Foo();
odd.boos.addAll(Arrays.asList(b1, b3, b5));
Foo even = new Foo();
even.boos.addAll(Arrays.asList(b2, b4, b6));
BigClass b = new BigClass();
b.foos.add(odd);
b.foos.add(even);
List<Boo> list = new ArrayList<>();
b.allBoos().forEach(boo -> list.add(boo));
System.out.println(list); // [1, 3, 5, 2, 4, 6]
}
}
关于懒惰的相同考虑也适用于此。