记录 同一个对象或数据,修改前后的比较,筛选出变化的字段

需求:在进行修改数据的审批流程时,需要将原始数据和当前已修改的数据进行一个展示,所修改的内容和字段分别有哪些。便于 用户查看

部分代码如下:

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;


@Data
public class User {
    private int id;
    private String name;
    private String email;


    // 使用Java 8的Method References和Lambda表达式来比较字段
    public Map<String, String[]> getChanges(User other) {
        Map<String, Function<User, String>> userFunctions = new HashMap<>();
        userFunctions.put("name", User::getName);
        userFunctions.put("email", User::getEmail);

        Map<String, String[]> changes = new HashMap<>();
        for (Map.Entry<String, Function<User, String>> entry : userFunctions.entrySet()) {
            String fieldName = entry.getKey();
            String originalValue = entry.getValue().apply(this);
            String newValue = entry.getValue().apply(other);
            if (!Objects.equals(originalValue, newValue)) {
                changes.put(fieldName, new String[]{originalValue, newValue});
            }
        }
        return changes;
    }

}


public class UserService {

    // 假设的方法,用于从数据库检索和更新用户
    private User retrieveUserFromDatabase(int userId) {
        return new User();
    }

    private void updateUserInDatabase(User user) {

    }

    public void updateUserAndRecordChanges(int userId, String newName, String newEmail) {
        // 从数据库中检索原始数据
        User originalUser = retrieveUserFromDatabase(userId);

        // 创建并修改数据的副本
        User updatedUser = new User();
        updatedUser.setId(originalUser.getId());
        updatedUser.setName(newName != null ? newName : originalUser.getName());
        updatedUser.setEmail(newEmail != null ? newEmail : originalUser.getEmail());
        // ... 复制和修改其他字段

        // 比较数据并记录差异
        Map<String, String[]> changes = updatedUser.getChanges(originalUser);
        if (!changes.isEmpty()) {
            // 记录或展示差异(此处为打印示例)
            for (Map.Entry<String, String[]> entry : changes.entrySet()) {
                System.out.println(entry.getKey() + " changed from " + entry.getValue()[0] + " to " + entry.getValue()[1]);
            }
            // 可选择将差异信息存储到日志、数据库或发送通知等
        }

        // 提交修改后的数据到数据库
        updateUserInDatabase(updatedUser);
    }

    public static void main(String[] args) {
        UserService userService = new UserService();
        // 假设要更新用户ID为1的用户
        userService.updateUserAndRecordChanges(1, "New Name", "newemail@example.com");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值