2015-08-19 9 views
6

Der Folgecode:java 8 Kollektor <String, A, R> ist keine funktionale Schnittstelle, wer kann sagen, warum?

public class Test { 
    public static void main(String[] args) { 

     Stream.of(1,2,3).map(String::valueOf).collect(Collectors::toList) 
    } 
} 

intellij mir sagen:

Collector<String, A, R> ist keine funktionale Schnittstelle

, aber wenn ich den Code ändern, wie folgt, ist alles in Ordnung, ich weiß nicht, warum ?

public class Test { 
    public static void main(String[] args) { 

     Stream.of(1,2,3).map(String::valueOf).collect(Collectors.<String>toList) 
    } 
} 

Antwort

3

Collector Die Schnittstelle bietet mehrere Methoden (combiner(), finisher(), supplier(), accumulator()) die eine Implementierung erforderlich ist, so kann es nicht eine funktionelle Schnittstelle sein, die nur eine Methode ohne Standardimplementierung haben kann.

Ich sehe nicht, wie sich Ihre Frage auf den beigefügten Code bezieht.

+0

Ich denke, sie wollten 'Collectors.toList()' verwenden. –

5

Der Grund dafür, dass die erste Syntax ist illegal ist, dass der Zieltyp von dem Signaturverfahren impliziert — Stream.collect(Collector) — a Collector ist. Collector hat mehrere abstrakte Methoden, daher ist es keine funktionale Schnittstelle und kann nicht die @FunctionalInterface Annotation haben.

Methodenreferenzen wie Class::function oder object::method können nur Funktionsschnittstellentypen zugewiesen werden. Da Collector keine funktionale Schnittstelle ist, kann keine Methodenreferenz verwendet werden, um das Argument collect(Collector) zu liefern.

Rufen Sie stattdessen Collectors.toList() als Funktion auf. Der explizite <String> Typparameter ist unnötig und Ihr "funktionierendes" Beispiel funktioniert am Ende nicht ohne Klammern. Dadurch wird eine Collector Instanz erstellt, die an collect() übergeben werden kann.