2014-11-06 5 views
21

Я только начал использовать Java 8, и мне интересно, есть ли способ написать метод, который возвращает Function?Возвращение лямбда от метода в Java 8?

Сейчас у меня есть метод, как показано ниже:

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

Есть ли способ, чтобы написать, что более сжато в Java 8? Я надеялся, что это будет работать, но это не делает:

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

ответ

25

Избавьтесь от оператора возврата внутри вашего определения функции:

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

Вы пропавшие полу двоеточиями:

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

Хотя, как отмечено, его можно укоротить до:

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

Вы могли бы написать это просто так:

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

Таким образом, ответ на 99% случаях был дан @assylias

Вы отсутствуете пол колоны:

return (it) -> { return "Hello, world: " + it; }; Although as noted it может быть сокращен до:

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

Тем не менее, я думаю, что стоит добавить это, если вы хотите присвоить свою лямбду переменной (использовать ее позже). Вы можете сделать это, набрав:

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

И тогда вы можете легко использовать его, один пример такого использования:

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

Учитывая, то можно даже сделать проще, если метод Wrapp.withTransaction() принимает тот же тип Callable как параметры. (я использую это для JPA атм)

3

Я хотел бы отметить, что это может быть более целесообразно использовать встроенный в IntFunction в этом случае:

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

IntFunction является частью standard API for functional interfaces который определяет диапазон полезных интерфейсов, в основном связанных с Java-примитивами.

Смежные вопросы