Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对双精度而非整数进行Java lambda求和?_Java_Lambda - Fatal编程技术网

如何对双精度而非整数进行Java lambda求和?

如何对双精度而非整数进行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 为

我有一段令人讨厌的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
为什么双精度与整数不同

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();