Java stream List 转 Map<Object, List>
JAVA中的
Stream
操作一定程度上方便了数据的转换,List
转Map
的场景下,针对downStream
的操作一般较少遇到,遇到的时候一时间也不容易想到处理方式,这里记录一下。
示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StringTest {
public static void main(String[] args) {
Student student1 = new Student(16, "Alice");
Student student2 = new Student(16, "Bob");
Student student3 = new Student(17, "Cherry");
Student student4 = new Student(17, "Delivery");
List<Student> studentList = new ArrayList<>();
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
studentList.add(student4);
// List to Map<Object, List>
// 1. 首先使用`Collectors.groupingBy()根据某个字段进行分组`
// 2. 分组的同时使用`Collectors.mapping()`将分组后的数据组织起来
Map<Integer, List<String>> map = studentList.stream()
.collect(
Collectors.groupingBy(Student::getAge,
Collectors.mapping(Student::getName, Collectors.toList())));
System.out.println(map);
// 这里将分组后的数据组织成一个Map
Map<Integer, Map<String, Student>> map2 = studentList.stream()
.collect(
Collectors.groupingBy(Student::getAge,
Collectors.toMap(Student::getName, student -> student)));
System.out.println(map2);
}
}
class Student {
private String name;
private Integer age;
Student(Integer age, String name) {
this.age = age;
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
输出:
# map1
{
16 = [Alice, Bob], 17 = [Cherry, Delivery]
}
# map2
{
16 = {
Bob = Student {
name = 'Bob', age = 16
},
Alice = Student {
name = 'Alice', age = 16
}
}, 17 = {
Cherry = Student {
name = 'Cherry', age = 17
},
Delivery = Student {
name = 'Delivery', age = 17
}
}
}