java8 Stream使用中的一些实践
使用Stream将List转换为Map时key冲突问题
如下:
把userList转换为userMap
id为key user 为value 由于user2和user3的id相同,所以会报错
@Test
void testStream0() {
User user1 = new User();
user1.setId("1");
user1.setName("小明");
User user2 = new User();
user2.setId("2");
user2.setName("小红");
User user3 = new User();
user3.setId("2");
user3.setName("小蓝");
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
// 把userList转换为userMap key为id value为user 由于user2和user3的id相同,所以会报错
Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
}
执行结果:Duplicate key
java.lang.IllegalStateException: Duplicate key User(id=2, name=小红)
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1255)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
正确使用方式:
明确指定key冲突时选择哪一个
// 把userList转换为userMap key为id value为user 遇到key冲突时,选择第二个key的值value2覆盖第一个key的值value1
Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (value1,value2)-> value2));
使用Stream时得到List的size为不为0,元素Object为null问题
@Test
void testStream0() {
User user1 = new User();
user1.setId("1");
List<User> userList = new ArrayList<>();
userList.add(user1);
List<String> list = userList.stream().map(u -> {
if (StringUtils.isNotBlank(u.getName())) {
return u.getName();
} else {
return null;
}
}).collect(Collectors.toList());
System.out.println(list.size());
System.out.println(JSON.toJSONString(list));
}
可以使用filter方法过滤掉null值
List<String> list = userList.stream().map(u -> {
if (StringUtils.isNotBlank(u.getName())) {
return u.getName();
} else {
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toList());
原文地址:https://blog.csdn.net/qq_40419080/article/details/138908646
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!