ObjectLikeUtil 是一个用于比较不同类型对象的工具类,提供了灵活的对象相等性判断和跨类型比较功能,支持数字、日期、集合、Map等多种数据类型的比较。
功能说明
对象相等性比较
import cn.sybn.data.ObjectLikeUtil;
// 基本相等性比较
boolean result1 = ObjectLikeUtil.like(null, null); // true
boolean result2 = ObjectLikeUtil.like(1, 1L); // true (数字类型自动转换)
boolean result3 = ObjectLikeUtil.like(1.1F, 1.1D); // true (浮点数精度比较)
boolean result4 = ObjectLikeUtil.like(1.0F, 1); // true (整数与浮点数比较)
// 集合比较
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Long> list2 = Arrays.asList(1L, 2L, 3L);
boolean result5 = ObjectLikeUtil.like(list1, list2); // true
// Set比较(忽略顺序)
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Long> set2 = new HashSet<>(Arrays.asList(3L, 1L, 2L));
boolean result6 = ObjectLikeUtil.like(set1, set2); // true
// Map比较(键值对比较,忽略顺序)
Map<String, Object> map1 = new HashMap<>();
map1.put("key1", "value1");
map1.put("key2", 123);
Map<String, Object> map2 = new HashMap<>();
map2.put("key2", 123L);
map2.put("key1", "value1");
boolean result7 = ObjectLikeUtil.like(map1, map2); // true
跨类型对象比较
// 数字与字符串比较
int result1 = ObjectLikeUtil.compare(1, "1"); // 0 (相等)
int result2 = ObjectLikeUtil.compare(22, 25); // -1 (小于)
// 日期比较
Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1000);
int result3 = ObjectLikeUtil.compare(date1, date2); // -1 (早于)
// 日期与字符串比较
String dateStr = "2020-01-25";
int result4 = ObjectLikeUtil.compare(DayUtil.newDate(2020, 1, 22), dateStr); // -1
特殊数据类型处理
// BigDecimal精度处理
BigDecimal bd1 = new BigDecimal("1.000");
BigDecimal bd2 = new BigDecimal("1.0");
boolean result = ObjectLikeUtil.like(bd1, bd2); // true
// 时间戳比较
Date now = new Date();
boolean result = ObjectLikeUtil.like(now.toString(), now); // true
// 数组比较
Integer[] arr1 = {1, 2, 3};
List<Integer> list = Arrays.asList(1, 2, 3);
boolean result = ObjectLikeUtil.like(arr1, list); // true
主要方法
like(Object obj1, Object obj2)- 判断两个对象是否相似(相等)compare(Object obj1, Object obj2)- 比较两个对象的大小关系equals(Object obj1, Object obj2)- 严格相等性判断(基于compare方法)
比较规则
数字类型比较
- 支持不同数字类型间的比较(Integer, Long, Float, Double, BigDecimal等)
- 自动处理精度差异
- 使用近似相等算法处理浮点数比较
日期类型比较
- 支持
java.util.Date,java.sql.Timestamp,LocalDateTime,LocalDate等日期类型 - 支持日期与字符串的比较
- 可选择是否比较毫秒级精度
集合类型比较
- List/数组: 按顺序逐个比较元素
- Set: 忽略顺序,去重后比较元素
- Map: 比较键值对,忽略键的顺序
特殊规则
null与null相等null与任何非null对象不相等- 不同类型的对象会尝试转换后比较
- 字符串比较使用字典序
应用场景
- 数据验证: 验证不同来源的数据是否一致
- 测试断言: 在单元测试中比较复杂对象
- 数据同步: 比较数据库记录与内存对象
- 缓存比较: 判断缓存数据是否需要更新
- API响应验证: 比较期望结果与实际结果
注意事项
- 集合比较时,List和数组会考虑元素顺序,而Set不会
- Map比较时键的顺序不影响结果
- 浮点数比较使用近似算法,避免精度问题
- 日期字符串比较会自动解析为日期对象后再比较