编辑:在此处找到解决方案: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/