簡體   English   中英

將 map 解析為 object 的優雅方法是什么?

[英]What is the elegant way to parse a map into an object?

我有一個隨機的 object,我需要解析 Map<String, String>

public class ExternalIncome {

    private Long operationId;

    private OffsetDateTime operationDate;

    private String operationCode;

    private String documentNumber;

    private OffsetDateTime documentDate;

    private String correspondentInn;

    private String correspondentName;

    private String correspondentAccount;
}

我只是這樣創建的,但我認為它不是很優雅,而且很丑陋。 此外,我需要攔截解析的每個迭代,以將動態字段保存到 object 內部的 Map<String, String> 中。

public static ExternalIncome create(Map<String, String> fields) {
        ExternalIncome externalIncome = new ExternalIncome();
        fields.forEach((k, v) -> {
            switch (k) {
                case "OPER_ID":
                    externalIncome.setOperationId(nullableLong(v));
                    break;
                case "OPER_DATE":
                    externalIncome.setOperationDate(Utils.toOffsetDateTime(v));
                    break;
               etc

你能幫我找到最好的方法嗎?

如果允許使用第三方庫,則可以使用 Jackson 的 ObjectMapper class 來完成。

final ObjectMapper mapper = new ObjectMapper();
final ExternalIncome income = mapper.convertValue(fields,ExternalIncome.class)

在你的案例中我沒有看到任何優雅的解決方案,但是你通過使用 map 擺脫了 switch/case,其中鍵是字段 map 中的字段名稱,值是 BiDirectionalConsumer。 可能不是最好的解決方案,但仍然如此。 注意:小心強制轉換和類型轉換。

假設您有字段 map:

Map<String, String> fields = new HashMap<>();   
fields.put("OPER_ID", "3"); 

您可以使用要執行的字段名稱和操作來定義第二個 map:

HashMap<String, BiConsumer<ExternalIncome, Object>> fieldsOperations = new HashMap<>();
fieldsOperations.put("OPER_ID", (extIncome, valueToSet) -> 
    extIncome.setOperationId(Long.valueOf((String) valueToSet))); //add as many as you want

然后你在哪里迭代你的 map 字段:

ExternalIncome externalIncome = new ExternalIncome();
fields.forEach((k,v) -> {        
    BiConsumer<ExternalIncome, Object> operation = fieldsOperations.get(k);
    if (operation == null) {    
        //add to dynamic fields map    
        return;
    }
    operation.accept(externalIncome, v);    
});

或者您可以重新考慮您的數據結構以擺脫擁有動態字段的想法,但如果您的用例可能的話,請考慮。

如何以優雅的方式使用 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解析此文本的一種優雅方法是什么? 在Java中將一個列表映射到另一個列表的最優雅方法是什么? 用最少的代碼編寫將Java對象序列化到Map(並解析回)的最快方法是什么? 如何以優雅的方式使用 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,> 在Java中解析控制台命令的優雅方法 使用Apache Commons Configuration 2.5從xml文件讀取地圖的最優雅方法是什么? 有沒有一種優雅的方法可以根據用於創建該對象的構造函數來更改類的對象可以使用的方法/變量? 用枚舉驗證地圖鍵集的優雅方法? 有沒有一種優雅的方法可以將地圖流減少到一個地圖 在Java 8中將映射連接到字符串的最優雅的方法
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM