)
在日常开发中变量比较大于、小于、等于、区间判断是最频繁的操作之一。一个好的工具类可以让代码更简洁、更安全、更易读。一、完整工具类源码javaimport java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 变量比较工具类 * * 功能特性 * 1. 支持 int、long、double、BigDecimal、Date、LocalDate、LocalDateTime、String 等类型 * 2. 支持 、、、、、! 六种比较操作 * 3. 支持区间判断开区间、闭区间、半开半闭 * 4. 支持空值安全null 返回 false * 5. 支持对象字段提取后比较 * 6. 支持集合过滤和排序 * * author YourName * since 1.0 */ public final class CompareUtils { private CompareUtils() { // 工具类私有构造防止实例化 } // 1. 基本比较int public static boolean isGreater(int a, int b) { return a b; } public static boolean isGreaterOrEqual(int a, int b) { return a b; } public static boolean isLess(int a, int b) { return a b; } public static boolean isLessOrEqual(int a, int b) { return a b; } public static boolean isEqual(int a, int b) { return a b; } public static boolean isNotEqual(int a, int b) { return a ! b; } /** * 判断 int 是否在闭区间内[min, max] */ public static boolean isInRange(int value, int min, int max) { return value min value max; } /** * 判断 int 是否在开区间内(min, max) */ public static boolean isInRangeExclusive(int value, int min, int max) { return value min value max; } /** * 获取两个 int 中的较大值 */ public static int max(int a, int b) { return Math.max(a, b); } /** * 获取两个 int 中的较小值 */ public static int min(int a, int b) { return Math.min(a, b); } // 2. 基本比较long public static boolean isGreater(long a, long b) { return a b; } public static boolean isGreaterOrEqual(long a, long b) { return a b; } public static boolean isLess(long a, long b) { return a b; } public static boolean isLessOrEqual(long a, long b) { return a b; } public static boolean isEqual(long a, long b) { return a b; } public static boolean isNotEqual(long a, long b) { return a ! b; } public static boolean isInRange(long value, long min, long max) { return value min value max; } public static boolean isInRangeExclusive(long value, long min, long max) { return value min value max; } // 3. 基本比较double /** * double 比较注意浮点数精度问题推荐使用 BigDecimal */ public static boolean isGreater(double a, double b) { return Double.compare(a, b) 0; } public static boolean isGreaterOrEqual(double a, double b) { return Double.compare(a, b) 0; } public static boolean isLess(double a, double b) { return Double.compare(a, b) 0; } public static boolean isLessOrEqual(double a, double b) { return Double.compare(a, b) 0; } public static boolean isEqual(double a, double b) { return Double.compare(a, b) 0; } public static boolean isNotEqual(double a, double b) { return Double.compare(a, b) ! 0; } public static boolean isInRange(double value, double min, double max) { return value min value max; } // 4. BigDecimal 比较 /** * 判断 a b */ public static boolean isGreater(BigDecimal a, BigDecimal b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static boolean isGreaterOrEqual(BigDecimal a, BigDecimal b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static boolean isLess(BigDecimal a, BigDecimal b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static boolean isLessOrEqual(BigDecimal a, BigDecimal b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static boolean isEqual(BigDecimal a, BigDecimal b) { if (a null b null) { return true; } if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a ! b */ public static boolean isNotEqual(BigDecimal a, BigDecimal b) { return !isEqual(a, b); } /** * 判断 BigDecimal 是否在闭区间内[min, max] */ public static boolean isInRange(BigDecimal value, BigDecimal min, BigDecimal max) { if (value null) { return false; } boolean greaterOrEqualMin min null || value.compareTo(min) 0; boolean lessOrEqualMax max null || value.compareTo(max) 0; return greaterOrEqualMin lessOrEqualMax; } /** * 判断 BigDecimal 是否在开区间内(min, max) */ public static boolean isInRangeExclusive(BigDecimal value, BigDecimal min, BigDecimal max) { if (value null) { return false; } boolean greaterThanMin min null || value.compareTo(min) 0; boolean lessThanMax max null || value.compareTo(max) 0; return greaterThanMin lessThanMax; } /** * 获取两个 BigDecimal 中的较大值null 安全 */ public static BigDecimal max(BigDecimal a, BigDecimal b) { if (a null b null) { return null; } if (a null) { return b; } if (b null) { return a; } return a.compareTo(b) 0 ? a : b; } /** * 获取两个 BigDecimal 中的较小值null 安全 */ public static BigDecimal min(BigDecimal a, BigDecimal b) { if (a null b null) { return null; } if (a null) { return b; } if (b null) { return a; } return a.compareTo(b) 0 ? a : b; } // 5. Date 比较 public static boolean isGreater(Date a, Date b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isGreaterOrEqual(Date a, Date b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isLess(Date a, Date b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isLessOrEqual(Date a, Date b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isEqual(Date a, Date b) { if (a null b null) { return true; } if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isNotEqual(Date a, Date b) { return !isEqual(a, b); } public static boolean isInRange(Date value, Date min, Date max) { if (value null) { return false; } boolean greaterOrEqualMin min null || value.compareTo(min) 0; boolean lessOrEqualMax max null || value.compareTo(max) 0; return greaterOrEqualMin lessOrEqualMax; } // 6. LocalDate 比较 public static boolean isGreater(LocalDate a, LocalDate b) { if (a null || b null) { return false; } return a.isAfter(b); } public static boolean isGreaterOrEqual(LocalDate a, LocalDate b) { if (a null || b null) { return false; } return !a.isBefore(b); } public static boolean isLess(LocalDate a, LocalDate b) { if (a null || b null) { return false; } return a.isBefore(b); } public static boolean isLessOrEqual(LocalDate a, LocalDate b) { if (a null || b null) { return false; } return !a.isAfter(b); } public static boolean isEqual(LocalDate a, LocalDate b) { if (a null b null) { return true; } if (a null || b null) { return false; } return a.isEqual(b); } public static boolean isNotEqual(LocalDate a, LocalDate b) { return !isEqual(a, b); } public static boolean isInRange(LocalDate value, LocalDate min, LocalDate max) { if (value null) { return false; } boolean greaterOrEqualMin min null || !value.isBefore(min); boolean lessOrEqualMax max null || !value.isAfter(max); return greaterOrEqualMin lessOrEqualMax; } public static boolean isInRangeExclusive(LocalDate value, LocalDate min, LocalDate max) { if (value null) { return false; } boolean greaterThanMin min null || value.isAfter(min); boolean lessThanMax max null || value.isBefore(max); return greaterThanMin lessThanMax; } // 7. LocalDateTime 比较 public static boolean isGreater(LocalDateTime a, LocalDateTime b) { if (a null || b null) { return false; } return a.isAfter(b); } public static boolean isGreaterOrEqual(LocalDateTime a, LocalDateTime b) { if (a null || b null) { return false; } return !a.isBefore(b); } public static boolean isLess(LocalDateTime a, LocalDateTime b) { if (a null || b null) { return false; } return a.isBefore(b); } public static boolean isLessOrEqual(LocalDateTime a, LocalDateTime b) { if (a null || b null) { return false; } return !a.isAfter(b); } public static boolean isEqual(LocalDateTime a, LocalDateTime b) { if (a null b null) { return true; } if (a null || b null) { return false; } return a.isEqual(b); } public static boolean isInRange(LocalDateTime value, LocalDateTime min, LocalDateTime max) { if (value null) { return false; } boolean greaterOrEqualMin min null || !value.isBefore(min); boolean lessOrEqualMax max null || !value.isAfter(max); return greaterOrEqualMin lessOrEqualMax; } // 8. String 比较字典序 public static boolean isGreater(String a, String b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isGreaterOrEqual(String a, String b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isLess(String a, String b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isLessOrEqual(String a, String b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } public static boolean isEqual(String a, String b) { return Objects.equals(a, b); } public static boolean isNotEqual(String a, String b) { return !Objects.equals(a, b); } public static boolean isInRange(String value, String min, String max) { if (value null) { return false; } boolean greaterOrEqualMin min null || value.compareTo(min) 0; boolean lessOrEqualMax max null || value.compareTo(max) 0; return greaterOrEqualMin lessOrEqualMax; } // 9. 泛型比较支持所有 Comparable 类型 /** * 判断 a bnull 安全null 返回 false */ public static T extends ComparableT boolean isGreater(T a, T b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static T extends ComparableT boolean isGreaterOrEqual(T a, T b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static T extends ComparableT boolean isLess(T a, T b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a b */ public static T extends ComparableT boolean isLessOrEqual(T a, T b) { if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a bnull 安全 */ public static T extends ComparableT boolean isEqual(T a, T b) { if (a null b null) { return true; } if (a null || b null) { return false; } return a.compareTo(b) 0; } /** * 判断 a ! b */ public static T extends ComparableT boolean isNotEqual(T a, T b) { return !isEqual(a, b); } /** * 判断值是否在闭区间内[min, max] */ public static T extends ComparableT boolean isInRange(T value, T min, T max) { if (value null) { return false; } boolean greaterOrEqualMin min null || value.compareTo(min) 0; boolean lessOrEqualMax max null || value.compareTo(max) 0; return greaterOrEqualMin lessOrEqualMax; } /** * 判断值是否在开区间内(min, max) */ public static T extends ComparableT boolean isInRangeExclusive(T value, T min, T max) { if (value null) { return false; } boolean greaterThanMin min null || value.compareTo(min) 0; boolean lessThanMax max null || value.compareTo(max) 0; return greaterThanMin lessThanMax; } /** * 获取两个 Comparable 中的较大值null 安全 */ public static T extends ComparableT T max(T a, T b) { if (a null b null) { return null; } if (a null) { return b; } if (b null) { return a; } return a.compareTo(b) 0 ? a : b; } /** * 获取两个 Comparable 中的较小值null 安全 */ public static T extends ComparableT T min(T a, T b) { if (a null b null) { return null; } if (a null) { return b; } if (b null) { return a; } return a.compareTo(b) 0 ? a : b; } // 10. 对象字段提取比较 /** * 判断对象的字段是否大于指定值 */ public static T, R extends ComparableR boolean isFieldGreater( T obj, FunctionT, R extractor, R target) { if (obj null) { return false; } R value extractor.apply(obj); if (value null || target null) { return false; } return value.compareTo(target) 0; } /** * 判断对象的字段是否小于指定值 */ public static T, R extends ComparableR boolean isFieldLess( T obj, FunctionT, R extractor, R target) { if (obj null) { return false; } R value extractor.apply(obj); if (value null || target null) { return false; } return value.compareTo(target) 0; } /** * 判断对象的字段是否在闭区间内 */ public static T, R extends ComparableR boolean isFieldInRange( T obj, FunctionT, R extractor, R min, R max) { if (obj null) { return false; } R value extractor.apply(obj); if (value null) { return false; } boolean greaterOrEqualMin min null || value.compareTo(min) 0; boolean lessOrEqualMax max null || value.compareTo(max) 0; return greaterOrEqualMin lessOrEqualMax; } // 11. 集合过滤 /** * 从列表中过滤出值在闭区间内的元素 */ public static T extends ComparableT ListT filterInRange( ListT list, T min, T max) { if (list null || list.isEmpty()) { return new ArrayList(); } return list.stream() .filter(item - isInRange(item, min, max)) .collect(Collectors.toList()); } /** * 从列表中过滤出对象字段在闭区间内的元素 */ public static T, R extends ComparableR ListT filterByFieldInRange( ListT list, FunctionT, R extractor, R min, R max) { if (list null || list.isEmpty()) { return new ArrayList(); } return list.stream() .filter(item - isFieldInRange(item, extractor, min, max)) .collect(Collectors.toList()); } /** * 从列表中过滤出值大于指定值的元素 */ public static T extends ComparableT ListT filterGreaterThan(ListT list, T target) { if (list null || list.isEmpty()) { return new ArrayList(); } return list.stream() .filter(item - isGreater(item, target)) .collect(Collectors.toList()); } /** * 从列表中过滤出值小于指定值的元素 */ public static T extends ComparableT ListT filterLessThan(ListT list, T target) { if (list null || list.isEmpty()) { return new ArrayList(); } return list.stream() .filter(item - isLess(item, target)) .collect(Collectors.toList()); } // 12. 比较结果封装链式调用 /** * 创建比较上下文用于链式比较 */ public static T extends ComparableT CompareContextT compare(T value) { return new CompareContext(value); } /** * 比较上下文类支持链式调用 */ public static class CompareContextT extends ComparableT { private final T value; public CompareContext(T value) { this.value value; } public boolean isGreaterThan(T other) { return CompareUtils.isGreater(value, other); } public boolean isGreaterOrEqualThan(T other) { return CompareUtils.isGreaterOrEqual(value, other); } public boolean isLessThan(T other) { return CompareUtils.isLess(value, other); } public boolean isLessOrEqualThan(T other) { return CompareUtils.isLessOrEqual(value, other); } public boolean isEqualTo(T other) { return CompareUtils.isEqual(value, other); } public boolean isBetween(T min, T max) { return CompareUtils.isInRange(value, min, max); } public boolean isBetweenExclusive(T min, T max) { return CompareUtils.isInRangeExclusive(value, min, max); } public T getValue() { return value; } } }二、使用示例1. 基本数值比较java// int boolean b1 CompareUtils.isGreater(10, 5); // true boolean b2 CompareUtils.isInRange(25, 18, 60); // true // BigDecimal BigDecimal price new BigDecimal(99.99); BigDecimal min new BigDecimal(10); BigDecimal max new BigDecimal(100); boolean inRange CompareUtils.isInRange(price, min, max); // true // double注意精度推荐用 BigDecimal boolean d1 CompareUtils.isGreater(99.9, 10.0); // true2. 日期比较javaLocalDate today LocalDate.now(); LocalDate start LocalDate.of(2026, 1, 1); LocalDate end LocalDate.of(2026, 12, 31); boolean inYear CompareUtils.isInRange(today, start, end); // true boolean isAfter CompareUtils.isGreater(today, start); // true // Date Date now new Date(); Date past new Date(now.getTime() - 3600000); boolean isFuture CompareUtils.isGreater(now, past); // true3. 字符串比较javaString version 2.5; String minVersion 2.0; String maxVersion 3.0; boolean valid CompareUtils.isInRange(version, minVersion, maxVersion); // true boolean isNewer CompareUtils.isGreater(version, 2.0); // true4. 对象字段提取比较javaData public class Order { private BigDecimal amount; private LocalDate orderDate; } Order order new Order(); order.setAmount(new BigDecimal(1500)); order.setOrderDate(LocalDate.now()); // 判断订单金额是否超过 1000 boolean isHigh CompareUtils.isFieldGreater(order, Order::getAmount, new BigDecimal(1000)); // 判断订单金额是否在 500-2000 之间 boolean inRange CompareUtils.isFieldInRange(order, Order::getAmount, new BigDecimal(500), new BigDecimal(2000));5. 集合过滤javaListInteger numbers Arrays.asList(10, 25, 30, 45, 60, 75); // 过滤出 20-50 之间的数字 ListInteger filtered CompareUtils.filterInRange(numbers, 20, 50); // 结果: [25, 30, 45] // 过滤出大于 50 的数字 ListInteger greater CompareUtils.filterGreaterThan(numbers, 50); // 结果: [60, 75]6. 链式调用java// 优雅的链式比较 boolean result CompareUtils.compare(new BigDecimal(50)) .isBetween(new BigDecimal(10), new BigDecimal(100)); // true boolean isLarge CompareUtils.compare(age) .isGreaterThan(18) .isLessThan(60); // 判断年龄在 18-60 之间7. 空值安全比较javaBigDecimal value null; BigDecimal target new BigDecimal(10); // null 返回 false不会 NPE boolean result CompareUtils.isGreater(value, target); // false boolean result2 CompareUtils.isInRange(value, target, new BigDecimal(100)); // false三、API 速查表方法说明支持类型isGreater(a, b)a bint, long, double, BigDecimal, Date, LocalDate, LocalDateTime, StringisGreaterOrEqual(a, b)a b同上isLess(a, b)a b同上isLessOrEqual(a, b)a b同上isEqual(a, b)a b同上isNotEqual(a, b)a ! b同上isInRange(value, min, max)value ∈ [min, max]同上isInRangeExclusive(value, min, max)value ∈ (min, max)同上max(a, b)取较大值同上min(a, b)取较小值同上isFieldInRange(obj, extractor, min, max)字段值 ∈ [min, max]任意对象filterInRange(list, min, max)过滤 List支持 Comparablecompare(value).isBetween(min, max)链式区间判断支持 Comparable四、设计总结特点说明null 安全所有方法对 null 值返回 false不会抛出 NPE类型丰富支持 int、long、double、BigDecimal、Date、LocalDate、LocalDateTime、String泛型支持提供泛型方法支持所有 Comparable 类型链式调用通过CompareContext支持优雅的链式比较集合处理提供集合过滤工具快速筛选数据字段提取支持从对象中提取字段后比较减少重复代码