【问题标题】:Strategies for converting collections from one type to another将集合从一种类型转换为另一种类型的策略
【发布时间】:2011-07-18 12:50:42
【问题描述】:

将带有EO(实体对象)的ArrayLists转换为DTO对象的ArrayLists或Ids的ArrayLists最有效的方法是什么。请记住,每个 EO 可能包含也是 EO 的属性,或 EO 的集合,应在内部转换为 DTO,或省略(取决于转换策略)。一般来说,有很多样板代码。

希望它像这样简单:

collectionOfUsers.toArrayList<UserDTO>(); 

或者..

collectionOfUsers.toArrayList<IEntity>();
// has only an id, therefore it will be converted
// into a collection of objects, having only an id.

当然,这样也不错:

collectionOfUsers.toArrayList<Long>()
// does the same thing, returns only a bunch of ids

当然,映射策略也应该有人掌握,例如工厂或某事。

有什么建议吗?

【问题讨论】:

    标签: java arraylist dto


    【解决方案1】:

    您可以只使用一个简单的界面来模拟转换。

    interface DTOConvertor<X,Y> {
        X toDTO(Y y);
    }
    
    public static List<X> convertToDTO(Collection<Y> ys, DTOConvertor<X,Y> c) {
        List<X> r = new ArrayList<X>(x.size());
        for (Y y : ys) {
            r.add(c.toDTO(y));
        }
        return y;
    }
    

    请注意,这与实现map 功能的库相同。

    在效率方面,我猜你会遇到问题,因为实体对象(可能)会从数据库中获取。你可以让人际关系急切地探索这是否有任何不同。

    【讨论】:

      【解决方案2】:

      您应该创建一个通用方法来从一种类型转换为另一种类型。这是一个简单的界面:

      public interface XFormer<T,U> {
          public T xform(U item);
      }
      

      然后您将在通用转换方法中使用它:

      public static <T, U> List<T> xForm(List<U> original, XFormer<T, U> strategy) {
          List<U> ret = new ArrayList<U>(original.size());
          for (U item: original) {
              ret.add(strategy.xform(item));
          }
          return ret;
      }
      

      它的一种用法可能如下所示:

      List<String> original;
      List<Long> xFormed = xForm(original, new XFormer<Long, String>() {
                               public Long xForm(String s) {
                                 return Long.parseLong(s);
                               }
                           });
      

      我在我的一个开源项目中使用了同样的策略。以第 166 行的 JodeList 为例。在我的例子中它有点简化,因为它只能从 Jode 转换为任何类型,但它应该能够扩展到任何类型之间的转换。

      【讨论】:

        【解决方案3】:

        考虑使用 Apache Commons BeanUitls.populate()。

        它将每个等效属性从一个 Bean 填充到另一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-11
          • 2011-09-24
          • 1970-01-01
          • 2012-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-14
          相关资源
          最近更新 更多