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();

拓展:

ListMap,值为对象

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

 

posted on 2021-08-30 23:45  smile学子  阅读(642)  评论(0编辑  收藏  举报