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

合計関数と平均関数を使用している部分に到達すると、次のエラーが発生します。

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 を呼び出すときに同じエラーが発生します。何らかの理由で、DoubleStream クラスではなく Stream を使用しているようです。チュートリアルでリンクされているラムダを有効にした最新の 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();
                                                                  ^^^^^^^^

根本的な理由は、Stream<Double>(によって返される) が(によって返されるmap) ではないことです。平均メソッドと合計メソッドがあるのは後者だけです。DoubleStreammapToDouble

于 2013-08-12T01:54:44.097 に答える