Java 8 List 转 Map
这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。
本文介绍从 Java 8 开始,如何把一个 List 转换为 Map,以及如果出现了冲突的 key 该如何处理。
准备:Dog.java
package com.wdbyte.demo;
public class Dog {
private String name;
private Integer age;
public Dog() {
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
// 省略 get set toString
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. Collectors.toMap
List
转 Map
可以使用 Java 8 中的 Collectors.toMap
进行转换。
示例1:把包含不同品种的狗类集合转换成 key
为狗的品种,value
为狗的年龄的 Map
。
package com.wdbyte.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ListToMap {
public static void main(String[] args) {
List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));
// to map,key dog name,value ,dog age
Map<String, Integer> dogMap = list.stream()
.collect(Collectors.toMap(Dog::getName, Dog::getAge));
System.out.println(dogMap);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
输出结果:
{牧羊犬=1, 哈士奇=2, 田园犬=3}
1
示例2:把包含不同品种的狗类集合转换成 key
为狗的品种,value
为狗的信息对象的 Map
。
List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));
// to map,key dog name,value ,dog age
Map<String, Dog> dogMap = list.stream()
.collect(Collectors.toMap(Dog::getName, dog -> dog));
System.out.println(dogMap);
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
输出结果:
{牧羊犬=Dog{, name='牧羊犬', age=1}, 哈士奇=Dog{, name='哈士奇', age=2}, 田园犬=Dog{, name='田园犬', age=3}}
1
# 2. List 转 Map,冲突 Key
还是上面的例子,如果有重复的 key 将会抛出异常。
示例1:List
转 Map
使用 Collectors.toMap
进行转换时,如果有 key 冲突。
package com.wdbyte.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ListToMapDuplicateKey {
public static void main(String[] args) {
List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("牧羊犬", 2));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));
// to map,key dog name,value ,dog age
Map<String, Integer> dogMap = list.stream()
.collect(Collectors.toMap(Dog::getName, Dog::getAge));
System.out.println(dogMap);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
输出结果:在遇到重复 key 时,抛出了异常。
Exception in thread "main" java.lang.IllegalStateException: Duplicate key 牧羊犬 (attempted merging values 1 and 2)
at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:133)
at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:180)
at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
...
1
2
3
4
5
6
2
3
4
5
6
示例2:传入第三个参数,当Key 冲突时,选择使用新值。
List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("牧羊犬", 2));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));
// to map,key dog name,value ,dog age
Map<String, Integer> dogMap = list.stream()
.collect(Collectors.toMap(Dog::getName, Dog::getAge, (oldData, newData) -> newData));
System.out.println(dogMap);
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
通过 (oldData, newData) -> newData)
来选择使用新值还是老值。
输出结果:
{牧羊犬=2, 田园犬=3, 哈士奇=2}
1
# 3. List 转 Map,指定 Map 类型
示例:传入第四个参数,指定 Map
类型。
public static void main(String[] args) {
List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("牧羊犬", 2));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));
// to map,key dog name,value ,dog age
Map<String, Integer> dogMap = list.stream()
.collect(Collectors.toMap(Dog::getName, Dog::getAge,
(oldData, newData) -> newData,
ConcurrentHashMap::new));
System.out.println(dogMap.getClass());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
输出结果:
class java.util.concurrent.ConcurrentHashMap
1
# 参考
文章作者: 程序猿阿朗
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0
许可协议。转载请注明来自 未读代码!
上次更新: 2022/12/05, 08:18:32
提示:评论前请刷新页面,否则评论的可能不是当前文章。