7

编辑:在这里找到解决方案: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();
}
4

1 回答 1

23

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

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

根本原因是 a Stream<Double>(returned by map) 不是 a DoubleStream(returned by mapToDouble)。只有后者有平均和求和方法。

于 2013-08-12T01:54:44.097 回答