首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字加法器

问数字加法器
EN

Code Review用户
提问于 2018-12-18 21:43:35
回答 1查看 43关注 0票数 2

此方法将列表中的所有数字相加,并将其作为双倍返回。

代码语言:javascript
复制
public HashMap<String, Double> add(HashMap<String, List<? extends Number>> map){
    HashMap<String, Double> result = new HashMap<>();

    map.forEach((key, value) -> {
        Double sum = 0.0;

        for (Number num : value){
            sum += num.doubleValue();
        }

        result.put(key, sum);
    });
    return result;
}

用不同的类型测试我的方法

代码语言:javascript
复制
public static void main(String[] args) {
    Adder adder  = new Adder();
    HashMap<String, List<? extends Number>> hashMap = new HashMap<>();

    List<Integer> list1 = new ArrayList<>();
    list1.add(1);
    list1.add(2);
    list1.add(3);

    List<BigDecimal> list2 = new ArrayList<>();
    list2.add(new BigDecimal("9.87654321e300"));
    list2.add(new BigDecimal("987654321"));
    list2.add(new BigDecimal("987654321"));


    hashMap.put("list1", list1);
    hashMap.put("list2", list2);

    System.out.println(adder.add(hashMap));


}

有什么办法可以改善这种情况吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2018-12-18 23:20:32

以下代码效率低下:

代码语言:javascript
复制
    Double sum = 0.0;

    for (Number num : value){
        sum += num.doubleValue();
    }

它为Double创建一个0.0对象,然后,由于Double对象是不可变的,所以对于value列表中的每个num,它都会为得到的部分和创建另一个Double对象。如果您用Double替换了double,那么您就不会在循环中为每次迭代创建新对象。

既然您已经在使用流API,为什么不使用DoubleStream::sum将这些值求和为double呢?

代码语言:javascript
复制
    double sum = value.stream().mapToDouble(Number::doubleValue).sum();

最后,可以使用Collectors.toMap()流方法创建映射。

代码语言:javascript
复制
public Map<String, Double> add(Map<String, List<? extends Number>> map) {
    return map.entrySet().stream()
          .collect(Collectors.toMap(Map.Entry::getKey,
                                    e -> e.getValue().stream()
                                              .mapToDouble(Number::doubleValue)
                                              .sum()));
}

这最后一步是否是一个“改进”可能是一个品味的问题。

注意:返回类型不再是HashMap;它只是一个Map。

add()方法不依赖于Adder的任何成员,因此方法应该是static。然后就可以摆脱Adder adder = new Adder()对象了。

使用List.of(...)和Map.of(...)可以简化测试代码:

代码语言:javascript
复制
public static void main(String[] args) {

    List<Integer> list1 = List.of(1, 2, 3);
    List<BigDecimal> list2 = List.of(new BigDecimal("9.87654321e300"),
                                     new BigDecimal("987654321"),
                                     new BigDecimal("987654321"));

    Map<String, List<? extends Number>> hashMap = Map.of("list1", list1,
                                                         "list2", list2);

    System.out.println(Adder.add(hashMap));
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/209937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档