2015-08-19 10 views
6

Kod obserwacji:java 8 Collector <String, A, R> nie jest interfejsem funkcjonalnym, kto wie dlaczego?

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

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

IntelliJ mi powiedzieć:

Collector<String, A, R> nie jest funkcjonalny interfejs

ale kiedy zmodyfikować kod w następujący sposób, wszystko jest ok, nie wiem dlaczego ?

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

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

Odpowiedz

3

Interfejs Collector ma wiele metod (combiner(), finisher(), supplier(), accumulator()) require implementację, więc to nie może być funkcjonalny interfejs, który może mieć tylko jedną metodę bez domyślnej implementacji.

Nie widzę, jak twoje pytanie jest związane z załączonym kodem.

+0

Myślę, że zamierzali użyć 'Collectors.toList()'. –

5

Powodem że pierwsza składnia jest nielegalne jest, że typ docelowy domniemanych metodą podpisu — Stream.collect(Collector) — jest Collector. Collector ma wiele metod abstrakcyjnych, więc nie jest interfejsem funkcjonalnym i nie może mieć adnotacji @FunctionalInterface.

Odwołania do metod, takie jak Class::function lub , można przypisać tylko do typów interfejsu funkcjonalnego. Ponieważ Collector nie jest interfejsem funkcjonalnym, odwołanie do metody nie może być użyte do dostarczenia argumentu do collect(Collector).

Zamiast tego, wywołaj Collectors.toList() jako funkcję. Wyraźny parametr typu <String> jest niepotrzebny, a twój przykład "działający" nie będzie działać bez nawiasów na końcu. Spowoduje to utworzenie instancji Collector, którą można przekazać do collect().

Powiązane problemy