介绍,list中存多个对象,用stream转换成map时,存在相同的key,会进行合并,,这时合并处理顺序就需要了解。
准备数据:
public static void main(String[] args) {
UserBaseInfoVO userBaseInfoVO1 = new UserBaseInfoVO();
userBaseInfoVO1.setId(1L);
userBaseInfoVO1.setName("张三");
UserBaseInfoVO userBaseInfoVO2 = new UserBaseInfoVO();
userBaseInfoVO2.setId(1L);
userBaseInfoVO2.setName("张三");
UserBaseInfoVO userBaseInfoVO3 = new UserBaseInfoVO();
userBaseInfoVO3.setId(1L);
userBaseInfoVO3.setName("张三");
UserBaseInfoVO userBaseInfoVO4 = new UserBaseInfoVO();
userBaseInfoVO4.setId(2L);
userBaseInfoVO4.setName("张三");
List<UserBaseInfoVO> list = new ArrayList();
list.add(userBaseInfoVO1);
list.add(userBaseInfoVO2);
list.add(userBaseInfoVO3);
list.add(userBaseInfoVO4);
AtomicInteger i = new AtomicInteger();
Map<Long, UserBaseInfoVO> map = list.stream().collect(Collectors.toMap(UserBaseInfoVO::getId, item->{
System.out.println("单次进入---"+i);
System.out.println("单次进入--参数-"+item.getId());
i.getAndIncrement();
item.setPhone("151");
return item;
}, (v1, v2) -> {
System.out.println("合并进入---"+i);
System.out.println("合并进入-参数--"+v1.getId()+"参数二----"+v2.getId());
i.getAndIncrement();
return v1;
}));
System.out.println(map);
}
执行结果
单次进入---0
单次进入--参数-1
单次进入---1
单次进入--参数-1
合并进入---2
合并进入-参数--1参数二----1
单次进入---3
单次进入--参数-1
合并进入---4
合并进入-参数--1参数二----1
单次进入---5
单次进入--参数-2
{1=UserBaseInfoVO(id=1, phone=151, name=张三, gender=null, avatar=null, certificationState=null), 2=UserBaseInfoVO(id=2, phone=151, name=张三, gender=null, avatar=null, certificationState=null)}
总结
,从代码执行结果可以,看出,每次都会进入--单次进入的代码块,在保存完数据之后,会在处理合并进入的代码块,进行合并操作。
所以如果有特殊处理,需要了解执行顺序。防止第一次进入值改变,在合并时出错。