Java-Stream Collectors.toMap() list转map
Java-Stream Collectors.toMap() list转map
一、list转map
List<UserInfoDetailVo> userList = new ArrayList<>();
//userInfo字段 id主键; nickname名称; className班级名称; age年龄; sex性别; money零花钱
userList.add(new UserInfoDetailVo(1L,"李明","一年级一班", 7,"男",new BigDecimal("45")));
userList.add(new UserInfoDetailVo(2L,"李明","一年级二班", 8,"男",new BigDecimal("34")));
userList.add(new UserInfoDetailVo(3L,"张三","一年级一班", 6,"男",new BigDecimal("14")));
userList.add(new UserInfoDetailVo(4L,"李四","一年级二班", 8,"男",new BigDecimal("11")));
//以用户id值作为map的key, UserInfo对象作为map的value
Map<Long,UserInfoDetailVo> map1 = userList.stream().collect(Collectors.toMap(UserInfoDetailVo::getId, m -> m));
//或着:
Map<Long,UserInfoDetailVo> map2 = userList.stream().collect(Collectors.toMap(it -> it.getId(), m -> m));
//或着:
Map<Long,UserInfoDetailVo> map3 = userList.stream().collect(Collectors.toMap(UserInfoDetailVo::getId, Function.identity()));
//或着:
Map<Long,UserInfoDetailVo> map4 = userList.stream().collect(Collectors.toMap(it -> it.getId(), Function.identity()));
注意:Collectors.toMap必须保证key的唯一性,getId值是具有唯一性,否则会抛出异常
二、list转map过程中,添加不同业务
(1)对map的key添加具体业务
Map<Long,UserInfoDetailVo> map5 = userList.stream().collect(Collectors.toMap(it -> {
//可添加具体业务,需要return map的key
return it.getId() + 1;
}, Function.identity()));
(2)对map的value添加具体业务
Map<Long,UserInfoDetailVo> map6 = userList.stream().collect(Collectors.toMap(it -> it.getId(), m -> {
//可添加具体业务,需要return map的value
m.setNickname("你好:" + m.getNickname());
return m;
}));
(3)对map的key和value添加具体业务
Map<Long,UserInfoDetailVo> map7 = userList.stream().collect(Collectors.toMap(it -> {
//可添加具体业务,需要return map的key
return it.getId() + 1;
}, m -> {
//可添加具体业务,需要return map的value
m.setNickname("你好:" + m.getNickname());
return m;
}));
三、指定字段返回给map的value
Map<Long,Integer> map8 = userList.stream().collect(Collectors.toMap(it -> it.getId(), it -> it.getAge());
//或着:
Map<Long,Integer> map9 = userList.stream().collect(Collectors.toMap(UserInfoDetailVo::getId, UserInfoDetailVo::getAge));
//对map的key添加具体业务,对map的value添加具体业务
Map<Long,String> map10 = userList.stream().collect(Collectors.toMap(it -> {
//可添加具体业务,需要return map的key
return it.getId() + 1;
}, m -> {
//可添加具体业务,需要return map的value
return "你好:".concat(m.getNickname());
}));
四、Collectors.toMap()有分组的功能
key重复时,可以使用(oldVal, currVal)进行特定业务处理
//下面会抛出异常,因为key重复了
Map<String,String> map11 = userList.stream().collect(Collectors.toMap(it -> it.getClassName(), it -> it.getNickname()));
//以学生班级为key, 学生名称为value
Map<String,String> map12 = userList.stream().collect(Collectors.toMap(it -> it.getClassName(), it -> it.getNickname(),
(oldVal, currVal) -> oldVal.concat(",").concat(currVal)));
//"一年级二班" -> "李明,李四"
//"一年级一班" -> "李明,张三"