Comparator.nullsLast 空指针问题

背景

线上报了个NPE,定位问题是nullsLast排序时从map里取到的值为null导致,但既然使用了nullsLast说明开发在写代码时对空指针是有防御意识的,虽然实际没有起到预期的效果。
仔细看了下代码发现大家对nullsLast/nullsFirst的理解并不深,有不少代码写法有问题,导致并不能起到想要的效果。

问题

List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6);
Map<Integer, Integer> map = new HashMap<>();
map.put(4, 400);
map.put(5, 500);
map.put(6, 600);

// Q1: 下面这行代码nullsLast报NPE了,nullsLast应该怎么用?
list.sort(Comparator.nullsLast(Comparator.comparing(map::get)));


// Q2: 下面两行代码的执行结果分别是什么?
list.sort(Comparator.comparing(map::get, Comparator.nullsLast(Integer::compareTo).reversed()));
list.sort(Comparator.comparing(map::get, Comparator.nullsLast(Comparator.reverseOrder())));

结论

  1. nullsLast 和 comparing的顺序要注意,nullsLast要用于可能产生npe的对象上才有效果
  2. nullsLast 参数中的comparator用于比较非null值,为null的值认为是相等的
  3. .reversed() 方法将比较器的排序翻转,Comparator.reverseOrder() 参数将nullsLast中非null数据的排序翻转
    具体Case结合下述代码分析,重点关注Case 1、3、4、6
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNullPointerException;

@Test
void comparatorNullsLastNpeTest() 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值