将集合从一种类型转换为另一种类型的策略

时间:2011-07-18 12:50:42

标签: java arraylist dto

将具有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

当然,有人也应该持有映射策略,例如Factory或者......

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您可以使用简单的界面来模拟转化。

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功能的库相同。

就效率而言,我猜你会遇到问题,因为实体对象(可能)将从数据库中获取。你可以建立关系来探索是否会产生任何影响。

答案 1 :(得分: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转换为任何类型,但它应该能够扩展为在任何类型之间进行转换。

答案 2 :(得分:0)

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

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