java编程遇到的几点坑

1. 子链表List.subList(int fromIndex, int toIndex)

先看下面的一段代码

        List<User> list = new ArrayList<>();
        list.add(new User("1", "a", "中国"));
        list.add(new User("1", "b", "中国"));

        List<User> subList = list.subList(0, 1);
        list.remove(1);
        subList.remove(0);

原list有2个元素,先subList成一个新List,然后两个list分别删除元素,表面上看两个没问题,其实会抛异常,主要是因为这个subList方法没有生成新的List而是引用了原来的List,然后记住start, end,可以看看源码就清楚了

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)
	at java.util.ArrayList$SubList.remove(ArrayList.java:1062)
	at com.example.gateway.lambatest.LambdaTest.main(LambdaTest.java:22)

2. 对象的函数引用user::setNameInfo

User user = null;
// 如果名称存存,则在名称后面加上“中国”,再设置到nameInfo中;否则不做处理
Optional.ofNullable(user)
        .map(User::getName)
        .map(n -> n + "_中国")
        .ifPresent(user::setNameInfo);

user是入参,可能为null, 如果为null时,则不做处理。因为被空指针搞怕了,于是“安全地”写了上面的代码。但这样仍然会抛空指针。“user::setNameInfo”为对空对象的引用。这样写才对

Optional.ofNullable(user)
        .map(User::getName)
        .map(n -> n + "_中国")
        .ifPresent(info -> user.setNameInfo(info));

针对idea的智能提示,如果你要使用的话,可千万不要以为它可以一步到位。上述代码,idea会提醒你使用lambda 替换。替完之后,就变成了错误的代码

要是发现"Replace lamdba with method reference"之后,还有warn提醒,那你就选择一种方式去解决该问题。

一般在大点的公司,代码中出现Warn是不会让你merge代码的。但是小点的公司就没这个要求了,一旦遇到类似的问题,上线就很容易出现问题

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值