stream多字段分组
时间: 2023-07-08 19:54:01 浏览: 75
可以使用Java 8中的Stream API和Collectors.groupingBy()方法实现多字段分组。假设有一个包含多个字段的对象列表,可以按照其中的两个字段进行分组,示例代码如下:
```
List<MyObject> list = ...
Map<String, Map<String, List<MyObject>>> result = list.stream()
.collect(Collectors.groupingBy(MyObject::getField1,
Collectors.groupingBy(MyObject::getField2)));
```
上述代码中,MyObject是包含多个字段的对象,getField1和getField2分别是两个字段的getter方法。使用Collectors.groupingBy()方法,首先按照getField1字段进行分组,然后在每个分组中再按照getField2字段进行分组,最终得到一个Map<String, Map<String, List<MyObject>>>类型的结果,其中外层的Map的键是getField1字段的值,内层的Map的键是getField2字段的值,对应的值是满足这两个字段值的对象列表。
相关问题
stream 多字段分组
您可以使用 Java 8 的 Stream API 来对多个字段进行分组。假设您有一个包含多个字段的对象列表,可以按以下方式对其进行分组:
```java
Map<String, Map<String, List<YourObject>>> groupedMap = yourObjectList.stream()
.collect(Collectors.groupingBy(YourObject::getField1,
Collectors.groupingBy(YourObject::getField2)));
```
这将首先按 `field1` 进行分组,然后在每个 `field1` 组中按 `field2` 进行分组。结果将是一个 `Map`,其中第一级键是 `field1` 的值,第二级键是 `field2` 的值,值是一个包含所有满足条件的 `YourObject` 对象的列表。您可以根据需要添加更多的级别来进行更多的分组。
stream流多字段分组
可以使用Java 8的流(Stream)API实现多字段分组。下面是一个示例代码:
```java
List<Person> persons = Arrays.asList(
new Person("Alice", "female", 25),
new Person("Bob", "male", 30),
new Person("Charlie", "male", 35),
new Person("David", "male", 40),
new Person("Eve", "female", 45),
new Person("Frank", "male", 50)
);
Map<String, Map<String, List<Person>>> groups = persons.stream()
.collect(Collectors.groupingBy(Person::getGender,
Collectors.groupingBy(p -> p.getAge() < 30 ? "young" : "old")));
groups.forEach((gender, subGroups) -> {
System.out.println("Gender: " + gender);
subGroups.forEach((ageGroup, people) -> {
System.out.println(" Age group: " + ageGroup);
people.forEach(System.out::println);
});
});
```
在这个例子中,我们首先创建了一个包含Person对象的列表。然后,我们使用流API的`groupingBy`方法将这个列表按照性别和年龄分成多个子组。最后,我们遍历这些子组并输出它们的内容。
结果输出如下:
```
Gender: female
Age group: young
Person{name='Alice', gender='female', age=25}
Age group: old
Person{name='Eve', gender='female', age=45}
Gender: male
Age group: young
Person{name='Bob', gender='male', age=30}
Person{name='Charlie', gender='male', age=35}
Age group: old
Person{name='David', gender='male', age=40}
Person{name='Frank', gender='male', age=50}
```
上述代码中,我们首先按照性别分组,然后按照年龄是否小于30岁分组。因此,最终的结果是一个嵌套的Map,其中外层Map的键是性别,内层Map的键是年龄分组标志,值是Person对象列表。