[英]Strategies for converting collections from one type to another
將帶有 EO(實體對象)的 ArrayLists 轉換為 DTO 對象的 ArrayLists 或 Ids 的 ArrayLists 的最有效方法是什么。 請記住,每個 EO 可能包含也是 EO 的屬性,或 EO 的 collections,應在內部轉換為 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
當然,也應該有人持有映射策略,例如工廠或某事。
有什么建議么?
您可以只使用一個簡單的界面來模擬轉換。
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
功能的庫相同。
在效率方面,我猜你會遇到問題,因為實體對象將(可能)從數據庫中獲取。 你可以讓人際關系急於探索這是否有什么不同。
您應該創建一個通用方法來從一種類型轉換為另一種類型。 這是一個簡單的界面:
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 轉換為任何類型,但它應該能夠擴展到任何類型之間的轉換。
考慮使用 Apache Commons BeanUitls.populate()。
它會將每個等效屬性從一個 Bean 填充到另一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.