gpt4 book ai didi

java - 如何使用 Java 8 Streams 以及 map 和列表计算两个子组的总计

转载 作者:行者123 更新时间:2023-12-02 12:58:47 26 4
gpt4 key购买 nike

我有一个Car POJO:

class Car
{
String make;
int year;
BigDecimal amount;
}

还有一个List<Car>诸如此类的汽车:

make  : year : price
honda : 2011 : $20,000
honda : 2011 : $30,000
honda : 2012 : $50,000
ford : 2012 : $12,000

我想要的结果是:

// Map<make, List<year, totalForYear>>
Map<String, Map<int, BigDecimal>> revenuesByMakeAndYear;

如何使用 Streams 实现这一目标?到目前为止,我已经完成了一半:

// Map<make, List<car>>
Map<String, List<Car>> carsByMake = cars.stream()
.collect(Collectors.toMap(
car -> car.getMake(),
car -> cars.stream()
.filter(subCar -> subCar.getMake().equals(car.getMake())
.collect(Collectors.toList())));

但是我如何进入下一步?

最佳答案

您可以使用嵌套的groupingBy按品牌和年份进行分组,然后reducing来产生总收入):

Map<String,Map<Integer,BigDecimal>> totals = 
cars.stream ()
.collect (Collectors.groupingBy (c->c.make,
Collectors.groupingBy (c->c.year,
Collectors.reducing (new BigDecimal(0),
c->c.amount,
BigDecimal::add))));

如果您希望求和的属性不是 BigDecimal,您可以将 reducing 替换为更简单的 summingInt summingLongsummingDouble

当然,假设您的 Car 类具有 getters,您应该将 c->c.make 替换为 Car::getMake 等...

Map<String,Map<Integer,BigDecimal>> totals = 
cars.stream ()
.collect (Collectors.groupingBy (Car::getMake,
Collectors.groupingBy (Car::getYear,
Collectors.reducing (new BigDecimal(0),
Car::getAmount,
BigDecimal::add))));

我在您的示例输入上运行了这个并得到:

{honda={2011=50000, 2012=50000}, ford={2012=12000}}

关于java - 如何使用 Java 8 Streams 以及 map 和列表计算两个子组的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47051707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com