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

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

这段代码中有一部分重复的代码,可以封装成一个单独的方法来提高代码的可读性和可维护性。你可以创建一个方法,如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 进行了处理。如果你的逻辑需要特别处理这两个对象,你可能需要调整这个部分的代码。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7547218
  • 以下回答来自chatgpt:

    我可以提供以下解决方案:

    可以借助函数封装请求,接收循环变量和具体请求内容作为参数,在函数内部进行循环请求。具体步骤如下:

    1. 定义一个函数,接收循环变量名、初始值、结束值、递增递减值和循环内容作为参数。

    2. 在函数内部使用 for 循环遍历从初始值到结束值的所有取值。

    3. 在 for 循环中,通过模板字符串拼接出具体的请求地址,将循环变量和其他参数插入到字符串中。

    4. 使用 axios 库发起请求,并将请求结果存储到一个数组中。

    5. 返回数组作为函数的结果。

    6. 外部调用函数,并传入具体的循环变量名、初始值、结束值、递增递减值和循环内容,获取请求结果数组。

    下面是一个示例代码,使用了 ES6 的箭头函数和 async/await 语法:

    const axios = require('axios');
    
    const loopRequests = async (name, start, end, step, content) => {
      const results = [];
      for (let i = start; i < end; i += step) {
        const url = `http://example.com/${content}?${name}=${i}`;
        const { data } = await axios.get(url);
        results.push(data);
      }
      return results;
    };
    
    const main = async () => {
      const results = await loopRequests('i', 0, 10, 1, 'example');
      console.log(results);
    };
    
    main();
    

    在上述示例代码中,loopRequests 函数接收循环变量名 name、初始值 start、结束值 end、递增递减值 step 和循环内容 content。通过 for 循环遍历整个区间,拼接出具体的请求地址并发送请求。最后将请求结果存储到一个数组中,并将结果数组作为函数的返回值。外部调用函数时,传入具体的参数,即可得到请求结果数组。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^