2014-09-05 9 views
5

Sto cercando di utilizzare le funzionalità di java 8. Durante la lettura official tutorial mi sono imbattuto in questo codiceCome funziona questa funzione lambda in java 8?

static void invoke(Runnable r) { 
    r.run(); 
} 

static <T> T invoke(Callable<T> c) throws Exception { 
    return c.call(); 
} 

e c'era una domanda:?

Quale metodo verrà richiamato nella seguente dichiarazione"

String s = invoke(() -> "done");

e la risposta è stata

Il metodo invoke(Callable<T>) verrà richiamato poiché tale metodo restituisce un valore; il metodo invoke(Runnable) no. In questo caso, il tipo di espressione lambda () -> "done" è Callable<T>.

quanto ho capito dal invoke dovrebbe restituire un String, chiama invoke di Callable. Ma non sono sicuro di come funzioni esattamente.

+1

Ho modificato la domanda un po '(per aggiungere ulteriori dettagli e link al tutorial). Se pensi che sia cambiato troppo sentiti libero di eseguire il rollback della mia modifica. – Pshemo

+0

@Pshemo Grazie per la modifica. Questo è quello che volevo chiedere. –

risposta

11

Diamo uno sguardo al lambda

invoke(() -> "done"); 

Il fatto che hai solo

"done" 

rende il valore lambda compatibile. Il corpo del lambda, che non sembra essere un'istruzione eseguibile, diventa implicitamente

{ return "done";} 

Ora, dal momento che Runnable#run() non ha un valore di ritorno e Callable#call() fa, questi ultimi saranno scelti.

Diciamo che aveva scritto

invoke(() -> System.out.println()); 

invece, il lambda sarebbe risolto a un'istanza di tipo Runnable, poiché non v'è alcuna espressione che potrebbe essere utilizzato un valore di ritorno.

+0

che non è vero, il tipo restituito non aiuta a determinare il metodo qui, cambia il tipo di ritorno da 'void' a' String' e controlla –

+0

@jigar Se cambiano la loro domanda semplicemente hanno 'invoke (() ->" "), senza alcun incarico, sarei d'accordo. –

+0

prova questo http://pastebin.com/SyhNszUv –