zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    启用div作为编辑器 添加contentEditalbe属性
    AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖-转
    angularjs的懒加载
    JavaScript 中的this指向问题
    Project Euler:Problem 41 Pandigital prime
    Android 消息机制
    新西兰天维网登录发送明文password
    使用Reveal来查看别人的APP界面+白苹果不刷机解决方式
    Android中List循环遍历性能对照
    2016年最新苹果开发人员账号注冊申请流程最强具体解释!
  • 原文地址:https://www.cnblogs.com/lshan/p/11158769.html
Copyright © 2011-2022 走看看