java - 使用 Guava 将多个 Collections<A> 合并到一个 Collection<B> 中的单个 Collection<A>

标签 java collections merge transform guava

我想做的是使用良好的旧循环非常简单。

假设我有一个包含 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/

相关文章:

java - 数据库同步在线/离线

java - portlet 2.0 (jsr286) 开发与 spring

java - 按单个数组上的 ArrayList 索引(行)对三个数组进行排序

Java 8 - 合并所有包含公共(public)元素的子集

javascript - 在特定索引处合并两个数组

MYSQL、DATETIME、事件、在 SQL 中或在输出中按月/年分组?

java - Lambda表达式和方法重载疑惑

Java 代码评估(IntelliJ IDE),在某些时候使用 toString()?

java - 多个列表之间的公共(public)元素

java集合: get objects are modified,添加和删除?