我想做的是使用良好的旧循环非常简单。
假设我有一个包含 B 列表的对象 A。
public class A
{
public List<B> myListOfB;
}
在其他一些方法中,我有一个 As 列表。基本上,我想做的是合并我所有 A 的 B 列表中的所有元素。
例如,使用循环很容易写出这样的东西:
public List<B> someMethod(List<A> myListOfAs)
{
List<B> toReturn = new ArrayList<A>();
for(A myA : myListOfAs)
{
toReturn.addAll(myA.myListOfB);
}
return toReturn;
}
但我想使用 Guava 以更实用的方式来完成它。这个例子非常简单,但是如果有条件的话它可能会复杂得多,因此使用函数式编程是有意义的。
我是 Guava 的新手。我已经开始使用它进行过滤和排序,但我很确定它也可以使用它,但我一直无法弄清楚如何使用它。我找到了这个 Combine multiple Collections into a single logical Collection?但它并没有真正回答我的问题。
最佳答案
您可以使用一个函数来提取列表并使用 concat 来展平列表。这会产生一个 Iterable。
List<A> input;
Function<A, List<B>> t = new Function<A, List<B>>() {
@Override public List<B> apply(A input) {
return input.myListOfB;
}
};
Iterable<B> transform = Iterables.concat(Iterables.transform(input, t));
如果需要,您可以创建一个列表:
ImmutableList<B> asList = ImmutableList.copyOf(transform);
//or
List<B> newArrayList = Lists.newArrayList(transform);
注意:通常,类的公共(public)字段是静态且不可变的或私有(private)的。其他一切都会给你带来麻烦。
关于java - 使用 Guava 将多个 Collections<A> 合并到一个 Collection<B> 中的单个 Collection<A>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10293120/