资源说明: Java8新特性Stream之list转map及问题解决
Java8中引入了Stream API,它提供了一种更简洁、更高效的方式来处理集合数据。其中,list转map是 Stream API 中的一个重要应用场景。本文将详细介绍Java8新特性Stream之list转map及问题解决,帮助读者更好地理解和应用Stream API。
一、List转Map
List转Map是指将List集合转换为Map集合。Stream API 提供了 Collectors.toMap() 方法来实现List转Map。例如:
```java
List list = new ArrayList<>();
list.add(new Person("1001", "小A"));
list.add(new Person("1002", "小B"));
list.add(new Person("1003", "小C"));
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
System.out.println(map);
```
输出结果为:
```
{1001=小A, 1002=小B, 1003=小C}
```
二、问题解决
在List转Map过程中,可能会遇到两个问题:key重复问题和空指针异常。
### key重复问题
当List集合中存在重复的key时,使用Collectors.toMap()方法将抛出Duplicate key异常。解决方法有三种:
1. 重复时用后面的value 覆盖前面的value
```java
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName, (key1, key2) -> key2));
```
输出结果:
```
{1001=小A, 1002=小B, 1003=小C}
```
2. 重复时将前面的value 和后面的value拼接起来
```java
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName, (key1, key2) -> key1 + "," + key2));
```
输出结果:
```
{1001=小A, 1002=小B,小C, 1003=小C}
```
3. 重复时将重复key的数据组成集合
```java
Map> map = list.stream().collect(Collectors.toMap(
Person::getId,
p -> {
List getNameList = new ArrayList<>();
getNameList.add(p.getName());
return getNameList;
},
(List value1, List value2) -> {
value1.addAll(value2);
return value1;
}
));
```
输出结果:
```
{1001=[小A], 1002=[小B], 1003=[小C]}
```
### 空指针异常
当List集合中存在null值时,使用Collectors.toMap()方法将抛出NullPointerException异常。解决方法是,在转换流中加上判空,即便value为空,依旧输出。
```java
Map> map = list.stream().collect(Collectors.toMap(
Person::getId,
p -> {
List getNameList = new ArrayList<>();
getNameList.add(p.getName());
return getNameList;
},
(List value1, List value2) -> {
value1.addAll(value2);
return value1;
}
));
```
输出结果:
```
{1001=[小A], 1002=[小B], 1003=[小C]}
```
List转Map是Java8新特性Stream API中的一个重要应用场景。通过掌握Collectors.toMap()方法和解决可能遇到的问题,可以更好地应用Stream API来处理集合数据。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。