当前位置: 首页 > news >正文

判断两个对象某些字段的值是否相同

1、借助mybatis plus的方法

import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
import lombok.SneakyThrows;
import org.apache.ibatis.reflection.property.PropertyNamer;import java.lang.reflect.Field;
import java.util.Objects;public class ObjectUtil {/*** 判断两个对象的某些字段的值是否相等* @param newObj 新对象* @param oldObj 旧对象* @param functions 函数式接口数组* @param <T> 泛型T* @return 两个对象某些字段的值是否相等*/@SafeVarargs@SneakyThrowspublic static <T> boolean isSame(Object newObj,Object oldObj,SFunction<T,?>... functions){for(SFunction<T,?> function:functions){Field newField=newObj.getClass().getField(getField(function));Field oldField=oldObj.getClass().getField(getField(function));newField.setAccessible(true);oldField.setAccessible(true);if(!Objects.equals(newField.get(newObj),oldField.get(oldObj))){return false;}}return true;}/*** 判断两个对象的某些字段的值是否相等* @param newObj 新对象* @param oldObj 旧对象* @param fields 字段数组* @return 是否相等*/@SneakyThrowspublic static boolean isSame(Object newObj,Object oldObj,String... fields){for(String filed:fields){Field newField=newObj.getClass().getField(filed);Field oldField=oldObj.getClass().getField(filed);newField.setAccessible(true);oldField.setAccessible(true);if(!Objects.equals(newField.get(newObj),oldField.get(oldObj))){return false;}}return true;}/*** 根据函数式接口的方法获取字段名称* @param sFunction 函数式接口* @param <T> 泛型T* @return 字段名称*/public static <T> String getField(SFunction<T,?> sFunction){return getColumn(LambdaUtils.resolve(sFunction));}/**** @param serializedLambda 函数式接口的Lambda表达式* @return 字段名*/public static String getColumn(SerializedLambda serializedLambda){return PropertyNamer.methodToProperty(serializedLambda.getImplMethodName());}}

既可以直接输入字段名,也可以输入Lambda表达式获取字段名

2、自己手写函数式接口完成从Lambda表达式到字段名的解析

   2.1 先定义可以序列化的函数式接口

import java.io.Serializable;
import java.util.function.Function;@FunctionalInterface
public interface MFunction<T, R> extends Function<T, R>, Serializable {}

  2.2 根据可以序列化的函数式接口解析字段名

         

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.property.PropertyNamer;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;@Slf4j
public class LambdaUtil {/**** @param serializedLambda 函数式接口的Lambda表达式* @return 字段名*/public static String getColumn(SerializedLambda serializedLambda) {return PropertyNamer.methodToProperty(serializedLambda.getImplMethodName());}/*** 根据函数式接口获取字段名成* @param func 函数式接口,例:User::getId()* @param <T> 泛型T* @param <R> 泛型R* @return 字段名*/@SneakyThrowsprivate static <T, R> String getColumn(MFunction<T, R> func) {// 直接调用writeReplaceMethod writeReplace = func.getClass().getDeclaredMethod("writeReplace");writeReplace.setAccessible(true);//反射调用Object sl = writeReplace.invoke(func);return getColumn((java.lang.invoke.SerializedLambda) sl);}}

http://www.lryc.cn/news/277441.html

相关文章:

  • TYPE-C接口取电芯片介绍和应用场景
  • 基于TI TPSXX系列 Buck电路应用计算-外围器件详细计算过程
  • NOIP2012提高组day1-T3:开车旅行
  • Golang Web框架性能对比
  • 【OCR】 - Tesseract OCR在mac系统中安装
  • 了解不同方式导入导出的速度之快
  • 2024年第九届计算机与通信系统国际会议(ICCCS2024) ,邀您相约西安!
  • 获取直播间的最新评论 - python 取两个list的差集
  • 2023年度总结:但行前路,不负韶华
  • 智数融合|低代码入局,推动工业数字化转型走"深"向"实"
  • 初学者的基本 Python 面试问题和答案
  • 支持向量机(Support Vector Machines,SVM)
  • golang一个轻量级基于内存的kv存储或缓存
  • henauOJ 1103: 统计元音
  • 虚幻引擎:开创视觉与创意的新纪元
  • T527 Android 13 编译步骤
  • OpenAI ChatGPT-4开发笔记2024-04:Chat之Tool之2:multiple functions
  • 14:00面试,14:07就出来了,问的问题有点变态。。。
  • 206. 反转链表(Java)
  • LeetCode 2807. 在链表中插入最大公约数【链表,迭代,递归】1279
  • Hive之set参数大全-3
  • Golang拼接字符串性能对比
  • 【问题解决】web页面html锚点定位后内容被遮挡问题解决【暗锚】
  • easyui datagrid无数据时显示无数据
  • 动态规划python简单例子-斐波那契数列
  • 免 费 搭 建 多模式商城:b2b2c、o2o、直播带货一网打尽
  • Python AttributeError: ‘NoneType‘ object has no attribute ‘shape‘如何解决
  • vue3自定义确认密码匹配验证规则
  • 岗位所处定位,岗位职责
  • 2024阿里云服务器配置推荐方案