java - 将映射解析为对象的优雅方法是什么?

标签 java

我有一个随机对象,我需要解析 Map

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;
}

我刚刚这样创建了它,但我认为它不太优雅,相当丑陋。另外,我需要拦截解析的每次迭代,以将动态字段保存到对象内部的 Map 中。

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

你能帮我找到最好的方法吗?

最佳答案

在您的情况下,我没有看到任何优雅的解决方案,但是您可以通过使用映射来摆脱 switch/case,其中键是字段映射中的字段名称,值是 BiDirectionalConsumer。可能不是最好的解决方案,但仍然如此。注意:要小心强制转换和类型转换。

假设您有字段映射:

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

您可以使用字段名称和要执行的操作定义第二个映射:

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);    
});

或者您可以重新考虑您的数据结构,以摆脱拥有动态字段的想法,但我不知道您的用例是否可能。

关于java - 将映射解析为对象的优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66239186/

相关文章:

java - 循环嵌套列表 RxJava2

java - java.util.concurrent 中的内存一致性

Java hibernate如何使用注解映射继承

java - 同步线程对象的run()方法

java - 如何使用哈希表改进一系列数字的 2 和算法?

c# - C#、Java 等语言如何避免类似 C/C++ 的独立编译?

java/android TCP sockets - 检测服务器是否离线

java - 尝试构建 FBReaderJ 时出现构建失败错误(https ://github. com/geometer/FBReaderJ)

java - 使用 Java 8 初始化新对象并设置值

Java 应用程序在一个系统上运行缓慢,但在另一个系统上运行却非常快?