一.背景
在很多场景下,需要将List的数据转化为Map的键值对的场景,方便快速查询数据。例如:需要根据工号查询出对应的人名名称明细场景。有两种实现场景,第一种通过每个工号查询一次数据库循环查询,明显这种方式不合理,因为对DB压力以及连接不利。第二种将工号集合(需要考虑数据量的场景,Oracle支持最大一千条,mysql虽然无上线,但是考虑性能以及内存占用情况需要考虑上限建议1000以下),接下来是以第二种方式进行展开。
二.开发实践
List<User> userList = new ArrayList<>();
userList.add(User.builder().id(123).name("测试123").build());
userList.add(User.builder().id(1231).name("测试1231").build());
userList.add(User.builder().id(1232).name("测试1232").build());
userList.add(User.builder().id(1233).name("测试1233").build());
userList.add(User.builder().id(1234).name("测试1234").build());
1.Java1.8之前不能使用stream流实现方式
Map<String, Long> idNameMap = new HashMap<String, Long>();
for(User user : userList ){
idNameMap.put(user.getName(), user.getId());
}
return idNameMap ;
2.Java1.8后支持stream流实现方式
return userList.stream().collect(Collectors.toMap(User::getName, User::getId);
三.存在的问题
如果使用2.1的方式,可能存在的问题,如果存在数据中有两条name相同的数据,则会报错java.lang.IllegalStateException: Duplicate key。
使用stream流的时候,不会像上面方式直接进行数据覆盖,而是报错。所以需要优化成:
return userList.stream().collect(Collectors.toMap(User::getName, User::getId , (entity1, entity2) -> entity1);
可以解决报错问题。