实现支持null的Comparable compareTo方法:仿Comparator nullsFirst/last逻辑
问题解决:实现支持nullsFirst逻辑的泛型compare方法
问题背景
现有企业级通用compare方法,签名如下:
static <U,T extends Comparable<U>> int compare(T a, U b) { return a.compareTo(b); }
该方法在传入null值时会抛出NullPointerException,符合Comparable规范,但业务要求实现类似Comparator.nullsFirst的逻辑:
- null小于任何非null值
- 两个null视为相等
- 禁止使用
if语句判断null - 不能修改方法名称与签名
解决方案
修改后的代码如下:
static <U, T extends Comparable<U>> int compare(T a, U b) { // 计算null状态差值:a为null则加1,b为null则减1 int nullDiff = (a == null ? 1 : 0) - (b == null ? 1 : 0); // 若null状态不同,返回反转后的差值(符合nullsFirst);否则处理相等情况或正常比较 return nullDiff != 0 ? -nullDiff : (a == null ? 0 : a.compareTo(b)); }
逻辑说明
- null状态判断:通过
(a == null ? 1 : 0) - (b == null ? 1 : 0)计算两个参数的null状态差值:- 当a为null、b非null时,nullDiff = 1 - 0 = 1,返回
-1(符合null小于非null) - 当a非null、b为null时,nullDiff = 0 - 1 = -1,返回
1(符合非null大于null) - 当两者都为null或都非null时,nullDiff = 0,进入后续逻辑
- 当a为null、b非null时,nullDiff = 1 - 0 = 1,返回
- 相等/正常比较:若都为null则返回0;若都非null则调用原
compareTo方法完成正常比较
验证示例
jshell> compare(1, 2); $5 ==> -1 jshell> compare("id", "hi"); $6 ==> 1 jshell> compare(null, "hi"); $7 ==> -1 jshell> compare(1, null); $8 ==> 1 jshell> compare(null, null); $9 ==> 0
内容的提问来源于stack exchange,提问作者nickl-
相关产品推荐
相关产品推荐

