簡體   English   中英

在Java中進行對象到對象轉換的簡單/優雅方法?

[英]Simple/elegant way to do object to object transformation in Java?

我必須接管並改進/完成一些將Java對象從第三方庫轉換為內部對象的代碼。 目前,這是通過以下類似的大if-else語句完成的:

if (obj instanceOf X)
{
    //code to initialize internal object
}
else if (obj instanceOf Y)
{
    //code to initialize different object
}
else if (obj instanceOf Z)
{
    //more init code
}
...

我個人認為這種解決方案並不令人滿意。 它很長而且很凌亂,更糟的是,許多if-else塊包含更多的if-else塊,用於處理子類和邊緣情況。 有沒有更好的解決方案來解決這個問題?

創建一個這樣的界面

public interface Converter<S,T> {
  public T convert(S source);
}

並為X,Y,Z的每個對象實現它。 然后將所有已知的轉換器放入地圖中,並開心起來!

雖然不適用於極端情況,但可以在類和轉換器之間建立映射

X.getClass()-> X轉換器
Y.getClass()-> Y轉換器

會讓您更接近。 如果還沒有找到葉子類,您還想檢查超類。

像這樣的代碼,以及所有的instanceof條件,都會讓接口大叫!

您可能需要使用方法public void initialize()創建public interface Initializable

然后,如果只是將if-else解析為一個obj.initialize()調用,那么所有這些。

如果這些內部對象提供了到應用程序的接口,而不是直接使用它們,請對其進行調整而不是對其進行轉換。

也就是說,如果您有這樣的事情:

public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }

Internal foo(ThirdPartyClass thirdParty) {
    InternalClass internal = new InternalClass();
    // convert thirdPaty -> internal
    return internal;
}

然后改為執行以下操作:

public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }

public class ThirdPartyInternalAdapter implements InternalInterface {
    private final ThirdPartyClass thirdParty;
    public ThirdPartyInternalAdapter(ThirdPartyClass thirdParty) {
        this.thirdParty = thirdParty;
    }
    // implement interface in terms of thirdParty
}

從您的問題尚不清楚這是否適用,但是如果適用,這可能比直接的對象到對象的轉換更容易,更有效。

如何以優雅的方式使用 Java8 返回 map<object, long> 來自列表<object>計數發生?<div id="text_translate"><p> 我知道標題很拗口,所以我將嘗試用一個例子來解釋。</p><p> 我有一個清單。 Chores 有一個 id 字段作為標識符,但列表將包含許多家務,其中一些將具有相同的 ID。 我的目標是返回一個 Map&lt;Chore, Long&gt; ,其中 long 將計算雜務的出現次數。 例如:</p><pre> List&lt;Chore&gt; choreList = new ArrayList&lt;Chore&gt;(); choreList.add(new Chore("1", "vacuum", "7-6-22"); //Numbers 1,2,3 are the ID's for each chore choreList.add(new Chore("2", "dusting", "7-1-22"); choreList.add(new Chore("3", "mowing", "7-15-22"); choreList.add(new Chore("1", "vacuum", "7-14-22"); choreList.add(new Chore("1", "vacuum", "7-18-22"); choreList.add(new Chore("2", "dusting", "7-24-22");</pre><p> 使用此列表和 Java8 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ function,我想返回一個 Map&lt;Chore, Long&gt;,其中包含家務 object 和事件。 因此,對於 ID 為“1”的雜項,長為 3。對於 ID 為“2”的雜項,長為 2……等等。</p><p> 我試圖為此找到一個優雅的解決方案,但看起來每個人都可以得到如下內容:</p><pre> Map&lt;String, Long&gt; choresById = chores.stream().collect(Collectors.groupingBy(Chore::getId, Collectors.counting()));</pre><p> 我怎樣才能想出 Map&lt;Chore, Long&gt; 而不是 Map&lt;String, Long&gt; (在這種情況下,字符串是 ID?)</p></div></object></object,>

[英]How to use Java8 in an elegant way to return a map of <Object, Long> from a List<Object> counting occurrence?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 在Java中分配對象ID的優雅方式 在Java中從向量添加不同對象的最優雅方法 有沒有一種簡單的方法來獲取java對象的大小? Java中的內聯對象實例化和轉換 如何以優雅的方式使用 Java8 返回 map<object, long> 來自列表<object>計數發生?<div id="text_translate"><p> 我知道標題很拗口,所以我將嘗試用一個例子來解釋。</p><p> 我有一個清單。 Chores 有一個 id 字段作為標識符,但列表將包含許多家務,其中一些將具有相同的 ID。 我的目標是返回一個 Map&lt;Chore, Long&gt; ,其中 long 將計算雜務的出現次數。 例如:</p><pre> List&lt;Chore&gt; choreList = new ArrayList&lt;Chore&gt;(); choreList.add(new Chore("1", "vacuum", "7-6-22"); //Numbers 1,2,3 are the ID's for each chore choreList.add(new Chore("2", "dusting", "7-1-22"); choreList.add(new Chore("3", "mowing", "7-15-22"); choreList.add(new Chore("1", "vacuum", "7-14-22"); choreList.add(new Chore("1", "vacuum", "7-18-22"); choreList.add(new Chore("2", "dusting", "7-24-22");</pre><p> 使用此列表和 Java8 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ function,我想返回一個 Map&lt;Chore, Long&gt;,其中包含家務 object 和事件。 因此,對於 ID 為“1”的雜項,長為 3。對於 ID 為“2”的雜項,長為 2……等等。</p><p> 我試圖為此找到一個優雅的解決方案,但看起來每個人都可以得到如下內容:</p><pre> Map&lt;String, Long&gt; choresById = chores.stream().collect(Collectors.groupingBy(Chore::getId, Collectors.counting()));</pre><p> 我怎樣才能想出 Map&lt;Chore, Long&gt; 而不是 Map&lt;String, Long&gt; (在這種情況下,字符串是 ID?)</p></div></object></object,> Hamcrest - 測試具有相同屬性值的復雜對象的優雅方式 是否有一種優雅的方式來展開包裝在2個嵌套的Optionals中的對象? 用FilterInputStream對象讀取大數據的一種優雅方法 將 Object 移動到列表末尾的優雅方式 將 map 解析為 object 的優雅方法是什么?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM