将具有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或者......
有什么建议吗?
答案 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填充到另一个。