【问题标题】:How can I summarize a numeric property in a Map object?如何汇总 Map 对象中的数字属性?
【发布时间】:2021-05-18 20:24:01
【问题描述】:

我有一个 Map 类型的 products 变量,我需要计算产品的总价格。

这是 products 变量:

Map<String, List<Product>> products

产品的定义如下:

class Product{
    string name;
    double price;
}

这是我尝试过的:

int sum = products.values().stream()
        .reduce(0, x -> x.stream().mapToDouble(y -> y.getPrice()).sum());

但是在上面的行中我得到了这个错误:

lambda 表达式中的错误返回类型:double 无法转换为 List

如何计算产品的总价?

【问题讨论】:

  • products.values() 是一个集合>`。
  • 好吧,你可以只使用两个循环。我假设你不想这样做?

标签: java java-stream


【解决方案1】:

如果你想总结所有产品的所有价格,我认为更好的解决方案是:

double sum = products.values().stream()
        .flatMap(List::stream)
        .mapToDouble(Product::getPrice)
        .sum();

【讨论】:

    【解决方案2】:

    这会有所帮助,而且更简单一些:

            int sum = (int) products.values()
                    .stream()
                    .flatMap(stream-> stream.stream())
                    .mapToDouble(product -> product.price)
                    .sum();
    

    首先,stream() 会给你一个 List 的流,所以你需要使用 flatMap 来提取 Product 对象,将这个产品映射到双 Stream,然后调用 sum()。

    【讨论】:

      【解决方案3】:

      如果你想像现在这样用 Map 总结它,那么你可以使用这个:

      int sum = (int)products.values().stream().mapToDouble(list->list.stream().mapToDouble(Product::getPrice).sum()).sum();
      

      我想你忘记了在产品中,.values 不是对象。相反,它们是对象列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-21
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        相关资源
        最近更新 更多