簡體   English   中英

將 collections 從一種類型轉換為另一種類型的策略

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM