1

假设你有一个A如下类:

public class A{
  private B b;

  public B getB(){return b;}
}

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

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

是否存在一个库,可以实现 function 所描述的魔法extractFrom?也许它使用反射,我不知道。或者,也许该库依赖于Extractor使用泛型的接口,例如

public interface Extractor<T,V>{

  public T extract(V source);
}

然后一个:

Extractor ex=...;
List<B> listOfB = extractFrom(listOfA, ex);

PS:标题好难听!请编辑标题,使其变得更有意义。

4

2 回答 2

4

有一个解决方案。这使用番石榴

您需要一个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 将具有FunctionGuava “发明”的其他细节(Predicate另一个示例)。

于 2013-06-04T14:19:08.237 回答
1

这被称为地图。

这里有一个答案

此外,您可以使用转换器来处理 apache commons

举例:

Collection<B> bs = CollectionUtils.collect(collectionOfA, new Transformer() {
    public Object transform(Object a) {
        return ((A) a).getB();
    }
});
于 2013-06-04T14:37:55.030 回答