我的bug呢 2023-06-08 16:57 采纳率: 57.1%
浏览 29
已结题

可以把这三个循环封装一下吗?

XDM,可以把这三个循环封装一下吗?

 if (rowBefore == null && rowAfter != null) {
            jsonArrayAfter = JSON.parseArray(rowAfter);
            for (Object obj : jsonArrayAfter) {
                for (Map.Entry<String, Object> stringObjectEntry : ((JSONObject) obj).entrySet()) {
                    DifferenceOfFieldsVO fieldsVO = new DifferenceOfFieldsVO();
                    fieldsVO.setTableName(tableName);
                    fieldsVO.setId(id);
                    fieldsVO.setFieldName(stringObjectEntry.getKey());
                    fieldsVO.setFieldAfter(String.valueOf(stringObjectEntry.getValue()));
                    list.add(fieldsVO);
                }
            }
        } else if (rowBefore != null && rowAfter == null) {//delete
            jsonArrayBefore = JSON.parseArray(rowBefore);
            for (Object obj : jsonArrayBefore) {
                for (Map.Entry<String, Object> stringObjectEntry : ((JSONObject) obj).entrySet()) {
                    DifferenceOfFieldsVO fieldsVO = new DifferenceOfFieldsVO();
                    fieldsVO.setTableName(tableName);
                    fieldsVO.setId(id);
                    fieldsVO.setFieldName(stringObjectEntry.getKey());
                    fieldsVO.setFieldBefore(String.valueOf(stringObjectEntry.getValue()));
                    list.add(fieldsVO);
                }
            }
        } else if (rowBefore != null && rowAfter != null) {//update
            jsonArrayBefore = JSON.parseArray(rowBefore);
            for (int i = 0; i < jsonArrayBefore.size(); i++) {
                JSONObject beforeObject =   (JSONObject)jsonArrayBefore.get(i);
                JSONObject afterObject =   (JSONObject)jsonArrayBefore.get(i);
                for (Map.Entry<String, Object> beforeEntry : beforeObject.entrySet())  {
                    DifferenceOfFieldsVO fieldsVO = new DifferenceOfFieldsVO();
                    fieldsVO.setTableName(tableName);
                    fieldsVO.setId(id);
                    fieldsVO.setFieldName(beforeEntry.getKey());
                    fieldsVO.setFieldBefore(String.valueOf(beforeEntry.getValue()));
                    fieldsVO.setFieldAfter(String.valueOf( afterObject.get(beforeEntry.getKey())));
                    list.add(fieldsVO);
                }
            }
        }

img

  • 写回答

2条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2023-06-09 13:05
    关注

    这段代码中有一部分重复的代码,可以封装成一个单独的方法来提高代码的可读性和可维护性。你可以创建一个方法,如processEntry,来处理这部分逻辑。

    private void processEntry(JSONObject obj, String tableName, String id, String after, List<DifferenceOfFieldsVO> list) {
        for (Map.Entry<String, Object> stringObjectEntry : obj.entrySet()) {
            DifferenceOfFieldsVO fieldsVO = new DifferenceOfFieldsVO();
            fieldsVO.setTableName(tableName);
            fieldsVO.setId(id);
            fieldsVO.setFieldName(stringObjectEntry.getKey());
            if (after != null) {
                fieldsVO.setFieldAfter(String.valueOf(stringObjectEntry.getValue()));
            } else {
                fieldsVO.setFieldBefore(String.valueOf(stringObjectEntry.getValue()));
            }
            list.add(fieldsVO);
        }
    }
    

    然后你可以在你的代码中调用这个方法:

    if (rowBefore == null && rowAfter != null) {
        jsonArrayAfter = JSON.parseArray(rowAfter);
        for (Object obj : jsonArrayAfter) {
            processEntry((JSONObject) obj, tableName, id, "after", list);
        }
    } else if (rowBefore != null && rowAfter == null) {
        jsonArrayBefore = JSON.parseArray(rowBefore);
        for (Object obj : jsonArrayBefore) {
            processEntry((JSONObject) obj, tableName, id, null, list);
        }
    } else if (rowBefore != null && rowAfter != null) {
        jsonArrayBefore = JSON.parseArray(rowBefore);
        for (int i = 0; i < jsonArrayBefore.size(); i++) {
            JSONObject beforeObject = (JSONObject) jsonArrayBefore.get(i);
            JSONObject afterObject = (JSONObject) jsonArrayBefore.get(i);
            processEntry(beforeObject, tableName, id, null, list);
            processEntry(afterObject, tableName, id, "after", list);
        }
    }
    

    注意:在最后一个 else if 分支中,我分别对 beforeObject 和 afterObject 进行了处理。如果你的逻辑需要特别处理这两个对象,你可能需要调整这个部分的代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要