java list 按某个字段分组存到map中
时间: 2025-06-24 13:44:14 浏览: 5
### Java 中通过字段对 List 进行分组并存储到 Map
在 Java 中,可以通过 `Collectors.groupingBy` 方法实现按指定字段对 `List` 进行分组并将结果存入 `Map`。以下是具体方法和代码示例:
#### 使用 Collectors.groupingBy 实现分组
假设有一个实体类 `Person`,其中包含两个字段:`name` 和 `age`。
```java
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30),
new Person("David", 25)
);
// 按年龄分组
Map<Integer, List<Person>> groupedByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
System.out.println(groupedByAge);
}
}
```
上述代码实现了基于 `age` 字段对 `people` 列表进行分组,并将结果存储在一个 `Map<Integer, List<Person>>` 中[^1]。
#### 处理复杂场景下的自定义分组逻辑
如果需要更复杂的分组逻辑(例如根据多个字段组合),可以传递一个函数作为参数给 `groupingBy` 方法。例如,可以根据姓名长度来分组:
```java
// 按名字长度分组
Map<Integer, List<Person>> groupedByNameLength = people.stream()
.collect(Collectors.groupingBy(person -> person.getName().length()));
System.out.println(groupedByNameLength);
```
此代码片段展示了如何使用 lambda 表达式来自定义分组依据[^1]。
#### 结合下游收集器进一步处理数据
有时仅需统计每组的数量或其他聚合操作,此时可结合下游收集器完成任务。例如计算各年龄段的人数:
```java
// 统计每个年龄段的人数
Map<Integer, Long> countByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
System.out.println(countByAge);
```
这里引入了第二个参数——另一个收集器 (`Collectors.counting`) 来替代默认行为 (即简单地将元素放入列表)[^1]。
---
###
阅读全文
相关推荐


















