2017-04-10 6 views
4

Ich habe den folgenden CodeEs ist möglich, den Rückgabetyp eines Lambda-Ausdrucks in Java 8 zu definieren?

Random rnd = new Random(); 
rnd.ints().limit(100) 
      .filter(i-> i > 0) 
      .map(Math::sqrt) 
      .forEach(System.out::println) 

, das die folgenden Compiler-Fehler erzeugt:

Streams.java:12: error: incompatible types: bad return type in method reference 
       .map(Math::sqrt) 
        ^
    double cannot be converted to int 

Wenn ich stattdessen

.mapToDouble(Math::sqrt) 

Es funktioniert. Das Problem besteht darin, dass der Compiler den Rückgabetyp des in Map verwendeten Lambda-Ausdrucks nicht ableiten kann. Gibt es eine Möglichkeit, es explizit anzugeben? Ich persönlich finde den MapToxxx-Funktionsumfang ungeschickt.

+1

Wahrscheinlich verwandt mit http://stackoverflow.com/questions/24421140/is-maptodouble-really-necessary-for-summing-a-listdouble-with-java-8-streams –

+1

Ouch. Typ Löschung schlägt wieder ... –

+0

Yeap, Sie beide richtig, und das war meine Angst. – pablochacin

Antwort

7

Das hat nichts damit zu tun, "den Rückgabetyp Ihres Lambdas zu deklarieren". Sie geben nur ein ungültiges Argument für map() an, und der Compiler sagt Ihnen dies.

map Die Methode in IntStream nimmt eine IntUnaryOperator (eine Funktion von int bis int). Es gibt keine Methode Math.sqrt, die in diese Signatur konvertiert werden kann.

+0

Sie haben Recht @ brian-goetz, ich habe mich nur gefragt, warum die MapToxxx benötigt werden, wenn die Kartenfunktion in Stream definiert ist als: ' Stream \t Karte (Funktion Mapper)' und sagte to "Gibt einen Stream zurück, der aus den Ergebnissen der Anwendung der gegebenen Funktion auf die Elemente dieses Streams besteht" – pablochacin

+3

Die Funktion 'map()' in 'Stream' ist so definiert, weil 'Stream' ein Strom von Objektreferenzen ist. Aber "IntStream" ist ein Stream von "int". Wenn wir 'InStream.map()' wie 'Stream.map()' definieren würden, wäre das Ergebnis immer Boxed_. Das vereitelt den Zweck der Verwendung von IntStream. –

Verwandte Themen