利用stream将List按两个字段分别两层分组生成Map<String, Map<String, Object>>
时间: 2023-10-14 14:54:30 浏览: 139
在Java 8中将List转换为Map对象方法
要将List按两个字段分别两层分组并生成Map<String, Map<String, Object>>,你可以使用Java的Stream API和Collectors.groupingBy方法来实现。以下是一个示例代码:
```java
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice", "Engineer", 25));
persons.add(new Person("Bob", "Engineer", 30));
persons.add(new Person("Charlie", "Manager", 35));
persons.add(new Person("Alice", "Manager", 40));
// 使用Stream API将List按两个字段分别两层分组生成Map<String, Map<String, Object>>
Map<String, Map<String, Object>> groupedMap = persons.stream()
.collect(Collectors.groupingBy(Person::getName,
Collectors.groupingBy(Person::getRole,
Collectors.collectingAndThen(
Collectors.toList(),
list -> list.stream().findFirst().orElse(null)
)
)
));
// 打印分组后的结果
for (Map.Entry<String, Map<String, Object>> entry : groupedMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
class Person {
private String name;
private String role;
private int age;
public Person(String name, String role, int age) {
this.name = name;
this.role = role;
this.age = age;
}
public String getName() {
return name;
}
public String getRole() {
return role;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", role=" + role + ", age=" + age + "]";
}
}
```
在这个例子中,我们创建了一个Person类,其中包含了name、role和age三个属性。然后,我们创建了一个包含Person对象的List。我们使用Stream API和Collectors.groupingBy方法来对List进行分组操作。首先,我们按照name字段进行一层分组,然后按照role字段进行二层分组。在二层分组的最后,我们使用Collectors.collectingAndThen方法将分组后的结果转换为只包含一个对象的List,并使用list.stream().findFirst().orElse(null)获取第一个对象(你可以根据需求进行调整)。最终,我们得到了一个Map<String, Map<String, Object>>类型的分组结果。
输出结果将会是:
```
Alice: {Engineer=Person [name=Alice, role=Engineer, age=25]}
Bob: {Engineer=Person [name=Bob, role=Engineer, age=30]}
Charlie: {Manager=Person [name=Charlie, role=Manager, age=35]}
```
这样,你就可以将List按两个字段分别两层分组生成Map<String, Map<String, Object>>了。
阅读全文