java比较相同/不同对象中的指定字段是否相同

直接上工具类

	/**
     * 比较不同对象,指定字段是否相等
     *
     * @param obj1  对象1
     * @param obj2  对象2
     * @param fieldNames 需要比较的字段
     * @return 比较结果
     */
    public static String compareDtoFieldsRes(Object obj1, Object obj2, String... fieldNames) {
        if (obj1 == null || obj2 == null) {
            return "校验内容为空";
        }
        for (String fieldName : fieldNames) {
            Object fieldValue1 = ReflectUtils.getFieldValue(obj1, fieldName);
            Object fieldValue2 = ReflectUtils.getFieldValue(obj2, fieldName);
            if (!Objects.equals(fieldValue1, fieldValue2)) {
                return "字段:" + fieldName + "信息有误";
            }
        }
        return null;
    }

    /**
     * 比较不同对象,指定字段是否相等
     *
     * @param obj1  对象1
     * @param obj2  对象2
     * @param fieldNames 需要比较的字段
     * @return 比较结果
     */
    public static boolean compareDtoFields(Object obj1, Object obj2, String... fieldNames) {
        if (obj1 == null || obj2 == null) {
            throw new IllegalArgumentException("比较的对象不能为空");
        }
        for (String fieldName : fieldNames) {
            Object fieldValue1 = ReflectUtils.getFieldValue(obj1, fieldName);
            Object fieldValue2 = ReflectUtils.getFieldValue(obj2, fieldName);
            if (!Objects.equals(fieldValue1, fieldValue2)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 比较同对象不同实例,指定字段是否相等
     *
     * @param obj1  对象1
     * @param obj2  对象2
     * @param fieldNames 需要比较的字段
     * @throws IllegalAccessException
     */
    public static boolean compareObjects(Object obj1, Object obj2, List<String> fieldNames) throws IllegalAccessException {
        if (obj1 == null || obj2 == null) {
            return false;
        }
        if (!obj1.getClass().equals(obj2.getClass())) {
            return false;
        }
        Class<?> clazz = obj1.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            if (Modifier.isStatic(field.getModifiers())) {
                continue;
            }
            if (!fieldNames.contains(field.getName())) {
                continue;
            }
            field.setAccessible(true);
            Object value1 = field.get(obj1);
            Object value2 = field.get(obj2);
            if (value1 == null && value2 == null) {
                continue;
            }
            if (value1 == null || value2 == null) {
                return false;
            }
            if (!value1.equals(value2)) {
                return false;
            }
        }
        return true;
    }


	/**
     * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
     */
    @SuppressWarnings("unchecked")
    public static <E> E getFieldValue(final Object obj, final String fieldName) {
        Field field = getAccessibleField(obj, fieldName);
        if (field == null) {
            log.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
            return null;
        }
        E result = null;
        try {
            result = (E) field.get(obj);
        } catch (IllegalAccessException e) {
            log.error("不可能抛出的异常{}", e.getMessage());
        }
        return result;
    }
可以通过使用Java 8提供的Stream API和Lambda表达式来根据指定的字符串字段对List进行去重操作,并对相同对象进行整数字段的累加。具体实现步骤如下: 1. 定义一个实体类,包含需要去重和累加的字段,例如: ``` public class Person { private String name; private int age; // 其他字段... // 构造函数、getter和setter方法... } ``` 2. 初始化一个包含多个Person对象的List,例如: ``` List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20)); personList.add(new Person("Jerry", 18)); personList.add(new Person("Tom", 25)); personList.add(new Person("Jack", 22)); ``` 3. 使用Stream API进行去重和累加操作,例如: ``` Map<String, Person> resultMap = personList.stream().collect( Collectors.toMap( Person::getName, // 指定map的key Function.identity(), // 指定map的value (oldValue, newValue) -> { // 指定合并函数,用于累加相同名称的Person对象的age字段 oldValue.setAge(oldValue.getAge() + newValue.getAge()); return oldValue; } ) ); List<Person> resultList = new ArrayList<>(resultMap.values()); // 将map转换为List ``` 以上代码将根据Person对象的name字段进行去重,并将相同名称的Person对象的age字段进行累加。最终,得到一个新的List对象,其包含去重后的Person对象相同名称的Person对象的age字段已经累加)。需要注意的是,此方法得到的Person对象的顺序可能与原始List的顺序不同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值