2013-08-12 11 views
6

EDIT gefunden http://www.dreamsyssoft.com/java-8-lambda-tutorial/map-reduce-tutorial.phpJava 8 Summe und insgesamt nicht

Ich folge diesem Tutorial:

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

Als ich zum Teil, wo es um die Summe ist mit und durchschnittliche Funktionen, bekomme ich den folgenden Fehler:

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> 

Ich bekomme den gleichen Fehler beim Aufruf der Summe. Aus irgendeinem Grund scheint es, dass es den Stream anstelle der DoubleStream-Klasse verwendet. Ich benutze die neueste jdk mit Lambda aktiviert, die im Tutorial verlinkt ist.

Hat jemand dieses Problem auch getroffen und konnte es lösen?

Hier ist ein einfaches Beispiel, das das Problem reproduziert:

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(); 
} 
+0

Oh wow, ich dachte, wir müssten bis September warten, um mit JDK 8 zu spielen. –

+0

Sie können eine frühe Freigabe erhalten – BevynQ

+0

Wenn Sie mit einer frühen Version arbeiten, ist es vielleicht besser, Fragen/Bedenken zu einer JDK 8 spezifischen Hilfe zu stellen Forum .... –

Antwort

19

Sie benötigen die Kartenfunktion zu ändern, um einen Strom von Primitiven zurückzukehren, zum Beispiel:

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

Der eigentliche Grund ist, dass a Stream<Double> (zurückgegeben von map) ist kein DoubleStream (zurückgegeben von mapToDouble). Nur letzteres hat Durchschnitts- und Summenmethoden.