java比对两个相同结构的实体的属性值变化

该文章介绍了一个Java工具类,用于比较两个具有相同结构的实体对象在更新后字段的变化。它接受自定义的比较字段和转换规则,转换规则用于处理如字典值转换等需求。在示例中,工具类成功识别并输出了账号、姓名和手机号码的变更,以及人员身份从字典值到中文名的转换。
摘要由CSDN通过智能技术生成

         在java中,两个相同结构的实体,我们想记录他每次修改后有哪些字段变化了,可以使用以下工具类来进行新旧实体的比较。调用compare方法时,传入的compareFields是自己定义的一个map,用于制定这个实体里面有哪些属性是需要进行比对的;而传入的transRule则是用于存放转换规则的map,主要用于一些存放字典值的属性,例如下面示例中的identityId属性,其中2代表求职者,3代表企业用户,而我们在比对的时候需要将字典值翻译成中文,所以需要传入这个map到transRule里面。如果有多个需要翻译的属性,则传入多个翻译规则的map就可以。

main方法的输出结果如下:比对结果:账号:由'zhangsan'更改为'lsi',姓名:由'张三'更改为'李四',手机号码:由'15627288888'更改为'15633322110',人员身份:由'求职者'更改为'企业用户'

package org.wtframework.rcsc.util;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import org.wtframework.platform.server.model.impl.User;

public class CompareObjectFields {

	/**    
	 * @Description: TODO 根据比较字段和比较规则来比较旧数据和新数据的改变之处并拼接成字符串  
	 * @author: zgx 
	 * @date:   2023年4月18日 上午10:38:57
	 * @param: compareFields 要比较的属性及其对应的中文名称
	 * @param: transRule	要比较的属性及其不同字典值对应的翻译
	 * @param: oldData 要比较的旧数据
	 * @param: newData 要比较的新数据      
	 * @return: String       
	 */
	public static String compare(Map<String, String> compareFields,Map<String, Map<String,String>> transRule,Object oldData,Object newData){
		int count = 0;
	    StringBuilder sb = new StringBuilder();

	    for (Field declaredField : oldData.getClass().getDeclaredFields()) {
	        try {
	        	String declaredFieldName = declaredField.getName();
	            if (compareFields.containsKey(declaredFieldName)) {
	                declaredField.setAccessible(true);
	                
	                Object oldObj = declaredField.get(oldData);
	                Object newObj = declaredField.get(newData);
	                if (Objects.nonNull(oldObj) && !oldObj.equals(newObj)) {
	                    if (count > 0) {
	                        sb.append(",");
	                    }
	                    sb.append(compareFields.get(declaredFieldName));
	                    sb.append(":由'");
	                    if(transRule.containsKey(declaredFieldName)){
	                    	Map<String,String> rule = transRule.get(declaredFieldName);
	                    	sb.append(rule.get(oldObj.toString()));
	 	                    sb.append("'更改为'");
	 	                    sb.append(rule.get(newObj.toString()));
	                    }else{
	                    	sb.append(oldObj.toString());
	 	                    sb.append("'更改为'");
	 	                    sb.append(newObj.toString());
	                    }
	                   
	                    sb.append("'");
	                    count++;
	                }
	            }
	        } catch (IllegalAccessException e) {
	            System.out.println("错误:"+e.toString());
	        }
	    }

	    System.out.println("比对结果:" + sb.toString());
	    return sb.toString();
	}
	
//	调用compare方法时可参考以下例子
	public static void main(String[] args) throws IOException {
		User oldData = new User();
		oldData.setUsername("zhangsan");
		oldData.setNickname("张三");
		oldData.setPhoneNumber("15627288888");
		oldData.setIdentityId(2);
		User newData = new User();
		newData.setUsername("lsi");
		newData.setNickname("李四");
		newData.setPhoneNumber("15633322110");
		newData.setIdentityId(3);
	    
	    //指定要比较的属性及其对应的中文名称
	    Map<String, String> compareFields = new HashMap<String, String>() {
	        {
	            put("username", "账号");
	            put("nickname", "姓名");
	            put("phoneNumber", "手机号码");
	            put("identityId", "人员身份");
	        }
	    };
	    
	    //指定要比较的属性及其不同字典值对应的翻译
	    Map<String, Map<String,String>> transRule = new HashMap<String, Map<String,String>>();
	    Map<String,String> identityRule = new HashMap<String, String>(){{
	    	put("2","求职者");
	    	put("3","企业用户");
	    }};
	    transRule.put("identityId", identityRule);
	    
	    
	    compare(compareFields, transRule, oldData, newData);
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrZhouGx

觉得对你有用的话可以支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值