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)));
//"一年级二班" -> "李明,李四"
//"一年级一班" -> "李明,张三"