需求:在进行修改数据的审批流程时,需要将原始数据和当前已修改的数据进行一个展示,所修改的内容和字段分别有哪些。便于 用户查看
部分代码如下:
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");
}
}