JDK8 List deptBatchRedisList 如果String code 与 LocalDateTime manufactureDate相同则BigDecimal quantity相加
时间: 2024-09-11 16:11:54 浏览: 48
在Java中,如果你想要实现这样一个功能,首先需要考虑的是如何将`String code`、`LocalDateTime manufactureDate`以及`BigDecimal quantity`组合成一个对象,因为`List`中存储的是同一种类型的元素。通常情况下,我们会创建一个类来封装这三个属性,然后使用一个`Map`来存储这些对象,其中键是由`code`和`manufactureDate`构成的,而值是`quantity`。
由于JDK 8引入了流(Streams)和Lambda表达式,这为我们处理集合提供了更简洁和强大的工具。以下是一个可能的实现方法:
首先,假设我们有一个`Item`类来表示`code`、`manufactureDate`和`quantity`:
```java
public class Item {
private String code;
private LocalDateTime manufactureDate;
private BigDecimal quantity;
// 构造函数、getter和setter省略
}
```
然后,我们可以创建一个`Map`,其键为`String`和`LocalDateTime`的组合,值为`BigDecimal`:
```java
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ItemAggregator {
public static void main(String[] args) {
List<Item> deptBatchRedisList; // 假设这是你已经有的List<Item>
// 使用流来处理集合,以创建一个Map,其中键是code和manufactureDate的组合,值是对应的quantity之和
Map<String, Map<LocalDateTime, BigDecimal>> aggregatedMap = deptBatchRedisList.stream()
.collect(Collectors.groupingBy(
item -> item.getCode(), // 键是由code组成的Map
Collectors.groupingBy(
item -> item.getManufactureDate(), // 内部键由manufactureDate组成
Collectors.reducing(
BigDecimal.ZERO, // 初始值
Item::getQuantity, // quantity的获取器
BigDecimal::add // 如何合并quantity
)
)
));
// 打印结果
aggregatedMap.forEach((code, dateQuantityMap) -> {
System.out.println("Code: " + code);
dateQuantityMap.forEach((date, totalQuantity) -> {
System.out.println("Manufacture Date: " + date + ", Total Quantity: " + totalQuantity);
});
});
}
}
```
在这段代码中,我们使用了`Collectors.groupingBy`两次来创建一个嵌套的`Map`,最外层的键是`code`,而内层的键是`manufactureDate`。对于每个`code`和`manufactureDate`的组合,我们使用`Collectors.reducing`来将所有的`quantity`相加,初始值为`BigDecimal.ZERO`。
阅读全文