2013-08-12 10 views
6

EDIT: trovato la soluzione qui: http://www.dreamsyssoft.com/java-8-lambda-tutorial/map-reduce-tutorial.phpJava 8 somma e totale non trovato

Sto seguendo questo tutorial:

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

Quando arrivo alla parte in cui si sta usando la somma e funzioni medie, viene visualizzato il seguente errore:

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> 

Ottengo lo stesso errore quando si chiama sum. Per qualche ragione sembra che stia usando lo Stream invece della classe DoubleStream. Sto usando l'ultimo jdk con lambda abilitato che è collegato nel tutorial.

Qualcuno ha riscontrato questo problema ed è stato in grado di risolverlo?

Ecco un semplice esempio che riproduce il problema:

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, ho pensato che dovevamo aspettare fino a settembre per giocare con JDK 8. –

+0

è possibile ottenere una versione di accesso anticipato – BevynQ

+0

Quando si lavora con una versione anticipata potrebbe essere meglio prendere domande/dubbi su un aiuto specifico di JDK 8 forum .... –

risposta

19

È necessario modificare la funzione di mappa per restituire un flusso di primitive, per esempio:

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

La ragione di fondo è che a Stream<Double> (restituito da map) non è un DoubleStream (restituito da mapToDouble). Solo quest'ultimo ha metodi medi e di somma.

Problemi correlati