参考:https://1609919154.iteye.com/blog/2400400
参考2 https://www.cnblogs.com/creaky/p/10802950.html
待整理: 结合1 ,2
整理一: 结合注解去比较两个对象的不同:-->只去比较带有注解的字段
ContrastObjUtils:
package com.sea.test.utils; import java.beans.PropertyDescriptor; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * @author sea * 比较两个Bean的内容 * @param <T> */ public class ContrastObjUtils<T> { /** * 自定义注解,如果字段上有该注解,就比较 * @author sea * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ComparaField { String value() default ""; } /** * 之比较有注解的字段 * @param oldBean * @param newBean * @return */ public String comparObjWithAnnotion(Object oldBean, Object newBean) { String result = ""; T pojo1 = (T) oldBean; T pojo2 = (T) newBean; try { Class clazz = pojo1.getClass(); Field[] fields = pojo1.getClass().getDeclaredFields(); int i = 1; // loop all field for (Field field : fields) { boolean hasAnnotation = field.isAnnotationPresent(ComparaField.class); // 如果没有注解,skip if (!hasAnnotation) { continue; } PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod(); Object o1 = getMethod.invoke(pojo1); Object o2 = getMethod.invoke(pojo2); if (o1 == null || o2 == null) { continue; } if (!o1.toString().equals(o2.toString())) { if (i != 1) { result += "; "; } // 要显示的字段名 String fieldName = field.getName(); result += i + "、" + fieldName + ",旧值:" + o1 + ",新值:" + o2; } i++; } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 比较所有field * @param oldBean * @param newBean * @return */ public String comparObj(Object oldBean, Object newBean) { String result = ""; T pojo1 = (T) oldBean; T pojo2 = (T) newBean; try { Class clazz = pojo1.getClass(); Field[] fields = pojo1.getClass().getDeclaredFields(); int i = 1; // loop all field for (Field field : fields) { if ("serialVersionUID".equals(field.getName())) { continue; } PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod(); Object o1 = getMethod.invoke(pojo1); Object o2 = getMethod.invoke(pojo2); if (o1 == null || o2 == null) { continue; } if (!o1.toString().equals(o2.toString())) { if (i != 1) { result += "; "; } // 要显示的字段名 String fieldName = ""; fieldName = field.getName(); result += i + "、" + fieldName + ",旧值:" + o1 + ",新值:" + o2; i++; } } } catch (Exception e) { e.printStackTrace(); } return result; } }
test ----------------------------------------------------
pojo:
package com.sea.test.pojo; import java.io.Serializable; import com.sea.test.utils.ContrastObjUtils.ComparaField; public class User implements Serializable{ @ComparaField private String name ; private String age ; @ComparaField private String hobby ; private String weight ; private String addr; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } /** * * @param name * @param age * @param hobby * @param weight * @param addr */ public User(String name, String age, String hobby, String weight, String addr) { super(); this.name = name; this.age = age; this.hobby = hobby; this.weight = weight; this.addr = addr; } public User() { super(); } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", hobby=" + hobby + ", weight=" + weight + ", addr=" + addr + "]"; } }
testCase:
package com.sea.test; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import com.sea.test.pojo.User; import com.sea.test.utils.ContrastObjUtils; public class UtilsTest { /** * meiyou 注释,比较所有 * @throws Exception */ @Test public void testCompara1() throws Exception { /** * @param name * @param age * @param hobby * @param weight * @param addr */ User user1 = new User("AA","12Q","basktaball","120","beijing"); User user2 = new User("AB","12","basktaball","120","beijing2"); ContrastObjUtils<User> contrastObjUtils = new ContrastObjUtils<User>(); String contrastObj = contrastObjUtils.comparObj(user1, user2); System.out.println(contrastObj); //1、name,旧值:AA,新值:AB; 2、age,旧值:12Q,新值:12; 3、addr,旧值:beijing,新值:beijing2 } @Test public void testcomparObjWithAnnotion() throws Exception { /** * @param name * @param age * @param hobby * @param weight * @param addr */ User user1 = new User("AA","12Q","basktaball","120","beijing"); User user2 = new User("AB","12","basktaball1","120","beijing2"); ContrastObjUtils<User> contrastObjUtils = new ContrastObjUtils<User>(); String contrastObj = contrastObjUtils.comparObjWithAnnotion(user1, user2); System.out.println(contrastObj); //1、name,旧值:AA,新值:AB; 2、hobby,旧值:basktaball,新值:basktaball1 } @Test public void testName() throws Exception { // List<Company> oldList = // ; // List<Company> newList = // ; // List<Map<String, Company>> listMap = new ArrayList<>(); // // for (Company oldComp : oldList) { // newList.stream() // .filter(c -> c.code.equals(oldComp.code) && // c.region.equals(oldComp.region) && // c.type.equals(oldComp.type)) // .findAny() // .ifPresent(newCorrespond -> { // Map<String, Company> map = new HashMap<>(); // map.put("old", oldComp); // map.put("new", newCorrespond); // listMap.add(map); // }); // } User user1 = new User("AA","12Q","basktaball","120","beijing"); User user2 = new User("AB1","12","basktabal11l","120","beijing"); List<Map<String, User>> listMap = new ArrayList<>(); List<User> asList1 = Arrays.asList(user1); List<User> asList2 = Arrays.asList(user2); for (User user : asList1) { asList2.stream().filter(u->!u.getName().equals(user.getName())&&!u.getHobby().equals(user.getHobby())).findAny().ifPresent(newCorrespond->{ Map<String, User> map = new HashMap<>(); map.put("old", user); map.put("new", newCorrespond); listMap.add(map); }); } System.out.println(listMap.get(0)); } }