2013-08-12 23 views
6

EDIT: Znaleziono rozwiązanie tutaj: http://www.dreamsyssoft.com/java-8-lambda-tutorial/map-reduce-tutorial.phpJava 8 suma i całkowity Nie znaleziono

Obserwuję tym tutorialu:

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

Kiedy dostać się do części, w której jest za pomocą sumy i średnie funkcje, pojawia się następujący błąd:

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> 

Ten sam błąd pojawia się podczas wywoływania sumy. Z jakiegoś powodu wydaje się, że używa on strumienia zamiast klasy DoubleStream. Używam najnowszego jdk z włączoną obsługą lambda, która jest połączona z samouczkiem.

Czy ktoś również trafił w ten problem i był w stanie go rozwiązać?

Oto prosty przykład, który reprodukuje problem:

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, myślałem, że musimy poczekać do września, aby porozmawiać z JDK 8. –

+0

Możesz uzyskać wczesny dostęp do wydania – BevynQ

+0

Podczas pracy z wczesnym wydaniem może być lepiej, aby zadać pytania/wątpliwości do konkretnej pomocy JDK 8 forum .... –

Odpowiedz

19

trzeba zmienić funkcję mapy, aby powrócić strumień prymitywów, na przykład:

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

Podstawowym powodem jest to, że a Stream<Double> (zwrócony przez map) nie jest DoubleStream (zwrócony przez mapToDouble). Tylko ta ostatnia ma metody średnie i sumaryczne.