假设你有一个类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:标题太可怕了!请编辑标题,使其变得更有意义。
答案 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();
}
});