在java 8中从整数数组减少到两倍

pig*_*ack 2 java java-8 java-stream

这是我的代码:

// assuming HashMap<String, Integer> hashmap
double sum = hashmap.values().stream()
    .reduce(.0, (i, v) -> i + Math.pow(v,2) + 0.5 );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,reduce应该采用(Integer i)和(double v)并将它们相加并将此reduce作为double返回.

相反,我得到这个错误:

- The method reduce(Integer, BinaryOperator<Integer>) in the type Stream<Integer> is not applicable for the arguments (double, (<no type> i, <no type> v) -> {})

- Type mismatch: cannot convert from double to Integer
Run Code Online (Sandbox Code Playgroud)

降低,

但是,这个修复:

// assuming HashMap<String, Integer> hashmap
double sum = hashmap.values().stream()
    .map((t)->(double)t)
    .reduce(.0, (i, v) -> i + Math.pow(v,2) + 0.5 );
Run Code Online (Sandbox Code Playgroud)

这样做有更优雅的方式吗?

Pau*_*ton 6

你只是想把它的值加起来v * v + 0.5

如果是这样,最明确的解决方案是

double sum = 0;
for (int v : hashmap.values())
    sum += v * v + 0.5;
Run Code Online (Sandbox Code Playgroud)

如果你必须使用流,答案是

double sum = hashmap.values().stream().mapToDouble((v) -> v * v + 0.5).sum();
Run Code Online (Sandbox Code Playgroud)

但尝试使用它是没有意义的,reduce()因为0.0它不是累加器的标识,并且累加器不是关联的.