2014-11-06 31 views
21

Ho appena iniziato a utilizzare Java 8 e mi chiedo se esiste un modo per scrivere un metodo che restituisca uno Function?Return Lambda dal metodo in Java 8?

In questo momento ho metodo come di seguito:

Function<Integer, String> getMyFunction() { 
    return new Function<Integer, String>() { 
    @Override public String apply(Integer integer) { 
     return "Hello, world!" 
    } 
    } 
} 

C'è un modo di scrivere che più succintamente in Java 8? Speravo che questo avrebbe funzionato, ma non è così:

Function<Integer, String> getMyFunction() { 
    return (it) -> { return "Hello, world: " + it } 
} 

risposta

25

Sbarazzarsi della vostra istruzione return all'interno della vostra definizione di funzione:

Function<Integer, String> getMyFunction() { 
    return (it) -> "Hello, world: " + it; 
} 
13

non trovi il punto e virgola:

return (it) -> { return "Hello, world: " + it; }; 

Sebbene come indicato, può essere abbreviato in:

return it -> "Hello, world: " + it; 
2

Si potrebbe scrivere semplicemente così:

Function<Integer, String> function = n -> "Hello, world " + n; 
1

Quindi, la risposta per il 99% dei casi è stato dato da @assylias

Vi manca il punto e virgola:

return (it) -> { return "Hello, world: " + it; }; Although as noted it può essere abbreviato:

return it -> "Hello, world: " + it;

Tuttavia, penso che valga la pena aggiungere questo, se si desidera assegnare il proprio lambda a una variabile (da utilizzare in seguito). Puoi farlo digitando:

Callable<YourClass> findIt =() -> returnInstanceOfYourClass(); 

E allora si può facilmente utilizzare, un esempio di un tale utilizzo:

if(dontNeedzToWrap()) { 
       return findIt.call(); 
    } 
return Wrapp.withTransaction(() -> findIt.call()); 

dato, le cose possono essere anche resa più semplice se il metodo Wrapp.withTransaction() accetta lo stesso tipo di Callable come parametri. (io uso questo per JPA atm)

3

Vorrei sottolineare che potrebbe essere più appropriato utilizzare il built-in IntFunction in questo caso:

IntFunction<String> getMyFunction() { 
    return it -> "Hello, world: " + it; 
} 

IntFunction è una parte della standard API for functional interfaces che definisce un intervallo di interfacce buone da avere, per lo più legate alle primitive Java.