Java比较两个对象的不同之处

参考: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
                + "]";
    }
    
    
    
}
View Code

 

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));
        
    }
    
}
View Code

 

转载于:https://www.cnblogs.com/lshan/p/11158769.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值