未找到 Java 8 总和和总数

标签 java lambda java-8

编辑:在此处找到解决方案:http://www.dreamsyssoft.com/java-8-lambda-tutorial/map-reduce-tutorial.php

我正在学习本教程:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

当我到达使用 sum 和 average 函数的部分时,出现以下错误:

UserAverageTest.java:68: error: cannot find symbol
        double average = users.parallelStream().filter(u -> u.age > 0).map(u -> u.age).average().getAsDouble();
                                                                                      ^
  symbol:   method average()
  location: interface Stream<Double>

我在调用 sum 时遇到同样的错误。出于某种原因,它似乎使用的是 Stream 而不是 DoubleStream 类。我正在使用教程中链接的启用了 lambda 的最新 jdk。

有没有人也遇到过这个问题并且能够解决它?

这是一个重现问题的简单示例:

class User {
    double age;
    public User(double age) { this.age = age; }
    double getAge() { return age; }
}

public static void main(String[] args) throws Exception {
    List<User> users = Arrays.asList(new User(10), new User(20), new User(30));
    double average = users.parallelStream()
                          .filter(u -> u.age > 0)
                          .map(u -> u.age)
                          .average()
                          .getAsDouble();
}

最佳答案

您需要更改 map 函数以返回图元流,例如:

double average = users.parallelStream().filter(u -> u.age > 0).mapToDouble(u -> u.age).average().getAsDouble();
                                                                  ^^^^^^^^

根本原因是 Stream<Double> (由 map 返回)不是 DoubleStream (由 mapToDouble 返回)。只有后者有average和sum方法。

关于未找到 Java 8 总和和总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18177918/

相关文章:

java - 无法从 openapi 客户端中的字符串反序列化 `java.time.OffsetDateTime` 类型的值

c# - 访问已处置的闭包 - 将方法标记为安全

Java 8 Streams 和 lambdas 保持严格的 FP

Java 8 流,将对象列表转换为 Map<String, Set<String>>

java - Java 8 是否提供了一种根据特定条件重复功能的好方法?

java - 从命令行启动时,Java 中 File 对象的绝对路径不同

java - 关于如何检查我的 Web 应用程序中的内存泄漏?

Java - 在哪里存储额外的资源文件

java - Java 8 和 Felix bundle 中 Unresolved 约束

Python 在 lambda 中尝试 Catch block