3

是否可以将以下函数创建为我可以重复使用的通用函数?

我想传入一个集合,并返回对象中特定属性的列表。

到目前为止,我有这个:

   private List<Integer> getPropertyABCIdsFromSomeObject(List<SomeObject> someObjects) {
        List<Integer> ids = new ArrayList<Integer>();
        for(SomeObject so : someObjects) {
            ids.add(so.getPropertyABCId());
        }
        return ids;
    }

所以这个方法只适用于 SomeObject 类型,并返回一个 PropertyABCId 列表。

现在,如果我想要一个其他属性的列表,我必须复制这个函数而几乎没有什么变化。

仿制药可以在这里挽救一天吗?

4

2 回答 2

3

你需要一个接口,但是是的:

interface HasProperty<T> {
    T getProperty();
}

public static <T> List<T> getProperties(List<? extends HasProperty<T>> items) {
    List<T> properties = new ArrayList<T>();
    for (HasProperty<T> item : items) {
        properties.add(item.getProperty());
    }
    return properties;
}
于 2012-11-18T19:39:49.627 回答
2

基于模板的解决方案

像这样定义一个模板:

public class ConvertListTemplate<A, B>
{
  public List<B> convert( List<A> list ) {
    List<B> result = new ArrayList<B>();
    for( A a : list ) {
      result.add(convertElement(a));
    }
    return result;
  }

  public abstract B convertElement(A element);
}

然后在您的代码中执行此操作:

List<Integer> result = new ConvertListTemplate<SomeObject, Integer>() {
  public Integer convertElement(SomeObject element) {
    return element.getPropertyABCId();
  }
}.convert(source);

基于策略的解决方案

使用这样的方法:

public <A, B> List<B> getProperties(
        List<A> list,
        GetPropertyStrategy<? super A, ? extends B> strategy
) {
  List<B> result = new ArrayList<B>();
  for( A a : list ) {
    result.add(strategy.getProperty(a));
  }
  return result;
}

带有策略界面:

public interface GetPropertyStrategy<A, B>
{
  public B getProperty(A toConvert);
}

然后像这样调用方法:

List<Integer> result = getProperties(source, new GetPropertyStrategy<SomeObject, Integer>() {
  public Integer getProperty(SomeObject element) {
    return element.getPropertyABCId();
  }
});
于 2012-11-18T20:13:49.017 回答