daf*_*ket 4 java collections merge transform guava
我想要做的就是使用好的旧循环非常简单.
假设我有一个包含B列表的对象A.
public class A
{
public List<B> myListOfB;
}
Run Code Online (Sandbox Code Playgroud)
在其他一些方法中,我有一个As的列表.基本上,我想要做的是合并所有我的B的B列表中的所有元素.
例如,使用循环编写类似的内容非常容易:
public List<B> someMethod(List<A> myListOfAs)
{
List<B> toReturn = new ArrayList<A>();
for(A myA : myListOfAs)
{
toReturn.addAll(myA.myListOfB);
}
return toReturn;
}
Run Code Online (Sandbox Code Playgroud)
但是我想用Guava以更加有效的方式做到这一点.这个例子非常简单,但是例如条件可能要复杂得多,因此使用函数式编程是有意义的.
我对番石榴很新.我已经开始使用它进行过滤和排序,但我很确定也可以使用它,但我无法弄清楚如何使用它.我发现这个将多个集合合并为一个逻辑集合?但它并没有真正回答我的问题.
您可以使用函数提取列表并使用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));
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以创建一个List:
ImmutableList<B> asList = ImmutableList.copyOf(transform);
//or
List<B> newArrayList = Lists.newArrayList(transform);
Run Code Online (Sandbox Code Playgroud)
注意:通常,类的公共字段是静态的,不可变的或私有的.其他一切都会给你带来麻烦.