实现功能:如何把list转成map
实现思路:借助java8特性-Collectors toMap
代码:
@AllArgsConstructor
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试代码如下:
public class ListToMapTest {
public static void main(String[] args) throws ParseException {
List<User> users = Arrays.asList(
new User("Jack",11),
new User("Kreas",12),
new User("Marry",13),
new User("Timi",14));
Map<Integer,String> map=users.stream().collect(Collectors.toMap(User::getAge,User::getName));
System.out.println(map);
}
}
输出如下:
修改代码:
public class ListToMapTest {
public static void main(String[] args) throws ParseException {
List<User> users = Arrays.asList(
new User("Jack",12),
new User("Kreas",12),
new User("Marry",13),
new User("Timi",14));
Map<Integer,String> map=users.stream().collect(Collectors.toMap(User::getAge,User::getName));
System.out.println(map);
}
}
再次运行输出如下:
原因:key冲突
解决:
Map<Integer,String> map=users.stream().collect(Collectors.toMap(User::getAge,User::getName,(k1, k2) -> k1));
总结:
第一个参数User::getAge表示选择User的getAge作为map的key值;
第二个参数v -> v表示选择将原来的对象作为map的value值;
第三个参数(v1, v2) -> v1中,如果v1与v2的key值相同,选择v1作为那个key所对应的value值