2015-08-19 11 views
6

IL CODICE:java 8 Collector <String, A, R> non è un'interfaccia funzionale, chi può dire perché?

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

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

IntelliJ mi dicono:

Collector<String, A, R> non è un'interfaccia funzionale

ma quando modifico il codice come segue, tutto è ok, non so perché ?

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

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

risposta

3

L'interfaccia Collector trovi più metodi (combiner(), finisher(), supplier(), accumulator()) l'richiedono un'implementazione, quindi non può essere un'interfaccia funzionale, che può avere un solo metodo con un'implementazione predefinita.

Non vedo come la domanda sia correlata al codice allegato.

+0

Penso che intendessero usare 'Collectors.toList()'. –

5

La ragione per cui la prima sintassi è illegale è che il tipo di destinazione implicita nel metodo firma — Stream.collect(Collector) — è un Collector. Collector ha più metodi astratti, quindi non è un'interfaccia funzionale e non può avere l'annotazione @FunctionalInterface.

I riferimenti del metodo come Class::function o object::method possono essere assegnati solo ai tipi di interfaccia funzionali. Poiché Collector non è un'interfaccia funzionale, non è possibile utilizzare alcun riferimento al metodo per fornire l'argomento a collect(Collector).

Invece, richiamare Collectors.toList() come una funzione. Il parametro di tipo esplicito <String> non è necessario e il tuo esempio "funzionante" non funzionerà senza parentesi alla fine. Ciò creerà un'istanza Collector che può essere passata a collect().