当前位置: 首页 > 知识库问答 >
问题:

streams API收集器中的BigDecimal求和

戚甫
2023-03-14

我当前的尝试基于double type类成员:

public Client whoPaidTheMost() {

/*METHOD EXPLOITING STREAM API*/

return shopping.entrySet()
        .stream()
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                Collectors.flatMapping(e -> e.getValue().entrySet().stream(),
                        Collectors.summingDouble(e->e.getKey().getPrize() * e.getValue())))) /*should be refactored*/
        .entrySet().stream()
        .max(Comparator.comparingDouble(Map.Entry::getValue))/*should be refactored*/
        .get()
        .getKey();
}
  • 外部键表示客户端
  • 内部密钥表示产品
  • 内部映射值(整数)表示属于特定客户端的指定产品的数量

Product类成员是name、category、price(以前是double类型)-想要将提供的代码重构为一个,使用price作为BigDecimal类型

我如何使这段代码也适用于BigDecimals?

  Client client = shopping.entrySet()
            .stream()
            .collect(Collectors.groupingBy(Map.Entry::getKey,
                    Collectors.flatMapping(e -> e.getValue().entrySet().stream(),
                            Collectors.mapping(e -> BigDecimal.valueOf(new Long(e.getValue())).multiply(e.getKey().getPrize()),
                                    Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))))
            .entrySet().stream()
            .max((e1, e2) -> (e1.getValue().compareTo(e2.getValue())))
            .get()
            .getKey();

仍然想知道是否可以在不使用Collectors.Mapping(e->BigDecimal.ValueOf(new Long(e.GetValue())).Multiply(e.GetKey().GetPrize())之前使用Collectors.Reduce进行重构?

共有1个答案

巫马昆杰
2023-03-14

您可以像这样重构它,

shopping.entrySet().stream()
    .collect(
        Collectors.groupingBy(Map.Entry::getKey,
            Collectors.flatMapping(
                e -> e.getValue().entrySet().stream()
                    .map(innerEntry -> innerEntry.getKey().getPrice()
                    .multiply(BigDecimal.valueOf(innerEntry.getValue()))),
            Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))))
    .entrySet().stream()
    .max(Map.Entry.comparingByValue()).get().getKey();

这里不需要任何附加的映射收集器。只需使用map运算符根据计算将map.entry转换为BigDecimal,并将该向下传递。final reduction运算符在这里起作用。零作为这个和的一个很好的单位元素。

 类似资料:
  • 目前的方法基于双类型的产品奖赏。 购物基本上是一个地图:, 外部键表示客户端 内部键代表产品。Product类成员为name、category、price(以前为double类型)-希望将提供的代码重构为一个,使用price作为bigdecimal类型 内部映射值(整数)表示属于特定客户端的指定产品的数量

  • 问题内容: 在启动时,似乎我的node.js应用程序使用了大约200MB的内存。如果我搁置一段时间,它会缩小到9MB左右。 是否可以从应用程序内执行以下操作: 检查应用程序正在使用多少内存? 请求垃圾收集器运行? 我问的原因是,我从磁盘加载了一些文件,这些文件是临时处理的。这可能导致内存使用量激增。但是我不希望在GC运行之前加载更多文件,否则存在内存不足的风险。 有什么建议 ? 问题答案: 如果使

  • 假设你有一张这样的物体地图(尽管想象它更大): rtype=133,有两个! 我想对Streams做的是这样的: 我在理解Collectors&groupBy的工作原理时遇到了一些麻烦,但我想这可能会用于本例。 在Java streams API中进行编码的正确方法是什么? 我很难找到类似的地图例子(人们在他们的例子中更多地使用列表)

  • 我是使用Java8流API的新手,但我希望使用它来解决以下问题。假设我有一个名为的POJO,它包含、和属性,这些属性可以表示以下内容的每一行记录: 看起来如下: 上述四条记录需要合并为两条按名称分组的记录,其中: 属性求和 属性求和 组合记录包括属性,该属性是和的累加和相乘的结果。 因此,上述结果将是: 一个名为的不同POJO将表示组合记录的每一行记录: 有哪些好的方法/解决方案可以将输入的列表转

  • 问题内容: 我从带有node.js的线程垃圾收集中学到了node.js使用世代GC。 我通常使用循环对象引用(最终我都会删除/确保超出范围),并想知道node.js是否能很好地处理它们。所以例如。如果使用参考完成。计数,会有一个问题,所以我想知道这个节点有多好。 一些使用场景: 对于每个http请求,我创建一个带有lambda的setTimeout,该lambda可能引用了范围对象。作用域对象还引

  • 本文向大家介绍Java 8中的收集器collectionAndThen()方法,包括了Java 8中的收集器collectionAndThen()方法的使用技巧和注意事项,需要的朋友参考一下 Java Collectors类中的collectingAndThen()方法调整收集器以执行额外的完成转换。它返回collector,collector执行下游collector的操作,然后执行附加的结束步