从Java中的对象列表中提取对象列表

时间:2013-06-04 14:14:16

标签: java

假设你有一个类A,如下所示:

public class A{
  private B b;

  public B getB(){return b;}
}

然后,您有一个A个对象的列表,并且您想要创建另一个包含相关B个对象的列表,即

List<A> listOfA=...
List<B> listOfB = extractFrom(listOfA, "getB");

存在一个执行函数extractFrom描述的魔法的库?也许它使用反射,我不知道。 或者,库可能依赖于使用泛型的Extractor接口,例如

public interface Extractor<T,V>{

  public T extract(V source);
}

然后一个人做:

Extractor ex=...;
List<B> listOfB = extractFrom(listOfA, ex);
PS:标题太可怕了!请编辑标题,使其变得更有意义。

2 个答案:

答案 0 :(得分:4)

有一个解决方案。这使用Guava

您需要Function<A, B>,然后使用Lists.transform()

应用该功能
final Function extractB = new Function<A, B>()
{
    @Override
    public B apply(final A input)
    {
        return input.getB();
    }
}

// And then:

final List<B> listOfB = Lists.transform(listOfA, extractB);

请注意,Java 8将具有Function,以及由Guava“发明”的其他细节(Predicate是另一个例子)。

答案 1 :(得分:1)

这被称为地图。

这里的SO有一个answer

此外,您可以使用transformers

来处理apache commons

以示例:

Collection<B> bs = CollectionUtils.collect(collectionOfA, new Transformer() {
    public Object transform(Object a) {
        return ((A) a).getB();
    }
});