如何对双精度而非整数进行Java lambda求和?
我有一段令人讨厌的java lambda代码,它可以工作(它对整数集合求和,是Netbeans IDE为我编写的…) 现在“时代”地图变成了如何对双精度而非整数进行Java lambda求和?,java,lambda,Java,Lambda,我有一段令人讨厌的java lambda代码,它可以工作(它对整数集合求和,是Netbeans IDE为我编写的…) 现在“时代”地图变成了Map而不是像上面那样的Map, 但是,简单地将Integer::sum更改为Double::sum是行不通的 Double thesum = times.values().stream().filter((val) -> (val != null)).reduce(thesum, Double::sum);//does not work 为
Map
而不是像上面那样的Map
,
但是,简单地将Integer::sum
更改为Double::sum
是行不通的
Double thesum = times.values().stream().filter((val) -> (val != null)).reduce(thesum, Double::sum);//does not work
为什么双精度与整数不同
TBH我其实不在乎,因为这是可行的,而且我更容易理解
for(double d : times.values()){
thesum+=d;
}
但是我认为那些喜欢将lambda语法作为人类幸福和个人满足的一种形式的人可能希望看到答案,因为它几乎和一般语法构造本身一样让我恼火
除了变量“thesum”未在使用前进行初始化之外,还要感谢您;代码看起来很好,并在eclipse中按预期编译和运行 为了清晰起见,我在下面添加了一个示例
public static void main(String[] args) {
Map<String,Double> times = new HashMap<>();
times.put("1", 1.0);
times.put("2", 2.0);
times.put("null", null);
times.put("3", 3.0);
times.put("4", 4.0);
Double thesum = 0.0;
thesum = times.values().stream()
.filter((val) -> (val != null))
.reduce(thesum, Double::sum);
System.out.println(thesum); // 10.0
}
publicstaticvoidmain(字符串[]args){
映射时间=新建HashMap();
次。put(“1”,1.0);
次。put(“2”,2.0);
次。put(“空”,空);
次。put(“3”,3.0);
次。put(“4”,4.0);
双thesum=0.0;
thesum=times.values().stream()
.filter((val)->(val!=null))
.减少(总和,双倍:总和);
System.out.println(thesum);//10.0
}
这里使用reduce
似乎很尴尬。流API包括一个DoubleStream
,它可以直接对值求和:
Double sum = times.values().stream().mapToDouble(n -> n).sum();
mapToDouble
并不特别优雅,但它是我所知道的从流
映射到双流
的最简单方法
还要注意的是,您的for
循环与流版本并不完全等效,因为它不处理null
值。double thesum=times.values().stream().filter(x->x!=null).mapToDouble(double::valueOf).sum()代码>谢谢!显然,我的大脑比lambda语法更烦人,因为我一定是在做别的傻事,因为现在它工作了。我想知道我是不是忘了把变量改成Double。。。。哦,人性。非常感谢。
Double sum = times.values().stream().mapToDouble(n -> n).sum();