此方法将列表中的所有数字相加,并将其作为双倍返回。
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;
}用不同的类型测试我的方法
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));
}有什么办法可以改善这种情况吗?
发布于 2018-12-18 23:20:32
以下代码效率低下:
Double sum = 0.0;
for (Number num : value){
sum += num.doubleValue();
}它为Double创建一个0.0对象,然后,由于Double对象是不可变的,所以对于value列表中的每个num,它都会为得到的部分和创建另一个Double对象。如果您用Double替换了double,那么您就不会在循环中为每次迭代创建新对象。
既然您已经在使用流API,为什么不使用DoubleStream::sum将这些值求和为double呢?
double sum = value.stream().mapToDouble(Number::doubleValue).sum();最后,可以使用Collectors.toMap()流方法创建映射。
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(...)可以简化测试代码:
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));
}https://codereview.stackexchange.com/questions/209937
复制相似问题