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代码的。但是小点的公司就没这个要求了,一旦遇到类似的问题,上线就很容易出现问题