将List对象集合,转成为Map集合
比如:用户类 User
public class User { // 用户ID private long id; // 用户名称 private String name; // 相关constrator,getter,setter,toString()方法已省略 }
初始化一个 List<User> 的数组
List<User> users = Arrays.asList( new User(101, "Jack"), new User(102, "Kreas"), new User(103, "Marry"), new User(104, "Timi"), new User(105, "Alice"));
现在需要在该 List 集合中找出 id = 102,id =104 这两个用户
采用 Collectors.toMap() 将List 转为 Map
Map<Long, User> map = users.stream().collect(Collector.toMap(User::getId, o -> o)); map.get(101L).toString(); map.get(104L).toString();
拓展:
List 转 Map,值为对象
Map<Long, User> map = users.stream().collect(Collectors.toMap(User::getId, o -> o));
List 转 Map,值为属性
Map<Long, String> map = users.stream().collect(Collectors.toMap(User::getId, User::getName));
List 转 Map,值为属性,且二次加工:
示例:姓名值后面统一加上一个 "_OK"字符
Map<Long, String> map = users.stream().collect(Collectors.toMap(User::getId, o -> o.getName() + "_OK"));
注意事项:
map 中的 key 值不能重复
如果重复,以第一个键为准,后面的则自动忽略(只需要在 Collectors.toMap() 方法里增加一个 Lamda表达式)
Map<Long, String> map = users.stream().collect(Collectors.toMap(User::getId, User::getName, (u1, u2) -> u1);
或者,采用覆盖原则,如果发现一个有重复的键,则自动覆盖之前值
Map<Long, String> map = users.stream().collect(Collectors.toMap(User::getId, User::getName, (u1, u2) -> u2);
值不能为空(解决办法:我们可以将null值默认为空字符串)
Map<Long, String> map = users.stream().collect(Collectors.toMap(User::getId, o -> {return o.getName() == null ? "" : o.getName()});
博客借鉴:https://zyqok.blog.csdn.net/article/details/108646765