stream多字段分组
时间: 2023-07-08 15:54:01 浏览: 199
可以使用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的groupingBy方法来实现。假设我们有一个Person类,包含了姓名、年龄、性别等字段,我们希望按照性别和年龄字段进行分组,可以这样写:
```
Map<String, Map<Integer, List<Person>>> groupedByGenderAndAge = persons.stream()
.collect(Collectors.groupingBy(Person::getGender,
Collectors.groupingBy(Person::getAge)));
```
这样,我们就可以得到一个以性别为第一级键,以年龄为第二级键的分组结果,其中每个分组都包含了对应的Person对象列表。
stream根据字段分组求和
在给定的代码中,使用了Java 8的Stream API来根据字段进行分组并求和。首先,通过使用`keySet().stream()`方法,将Map的键转换为Stream。然后,使用`map()`方法对每个键进行处理,将其拆分为多个字段,并创建一个新的对象。在这个例子中,使用`split("_")`方法将键拆分为三个字段:`deliveryAgentId1`、`productSku`和`checkOutTime`。接下来,使用这些字段创建一个新的`AgentCheckoutStockDetail`对象,并将对应的值设置为`countMap`中对应键的值。最后,使用`collect()`方法将处理后的对象收集到一个List中。
在求和的过程中,使用了`Collectors.summingLong()`方法,该方法接收一个函数作为参数,用于指定要对哪个字段进行求和。在这个例子中,使用了`AgentCheckoutStockDetail::getActualCount`方法引用,表示对`actualCount`字段进行求和。
综上所述,给定的代码使用Stream API根据字段进行分组,并对指定字段进行求和。
阅读全文