2015-09-03 19 views
11

Come posso fare qualcosa di simile in Java 8?esecuzione Java 8 lambda

boolean x = ((boolean p)->{return p;}).apply(true); 

In questo momento ho il seguente errore:

The target type of this expression must be a functional interface

+0

Gli esempi che posso vedere fare non usare {}, poiché è pensato per essere una singola affermazione. [Tutorial] (http://winterbe.com/posts/2014/03/16/java-8-tutorial/) – flaschenpost

+0

La stessa cosa senza un {} giro di ritorno p. Non penso che questo sia il problema. –

+2

Il tuo errore è nell'assumere che 'Funzione' abbia uno stato speciale in modo che il tipo di lambda venga automaticamente forzato in esso. La tua espressione non ha in effetti alcun vincolo di tipo di destinazione. –

risposta

22

Come per il JLS section 15.27:

It is a compile-time error if a lambda expression occurs in a program in someplace other than an assignment context (§5.2), an invocation context (§5.3), or a casting context (§5.5).

E 'anche possibile utilizzare un'espressione lambda in un return statement.

Possiamo quindi riscrivere il vostro esempio in quattro modi diversi:

  • Con la creazione di un contesto di assegnazione:

    Function<Boolean, Boolean> function = p -> p; 
    boolean x = function.apply(true); 
    
  • Con la creazione di un contesto invocazione:

    foobar(p -> p); 
    
    private static void foobar(Function<Boolean, Boolean> function) { 
        boolean x = function.apply(true); 
    } 
    
  • Creando un contesto di casting:

    boolean x = ((Function<Boolean, Boolean>) p -> p).apply(true); 
    
  • Utilizzando un return dichiarazione:

    boolean x = function().apply(true); 
    
    private static Function<Boolean, Boolean> function() { 
        return p -> p; 
    } 
    

Inoltre, in questo semplice esempio, l'intera espressione lambda può essere riscritta come:

UnaryOperator<Boolean> function = UnaryOperator.identity(); 
+0

Grazie mille! –