Подтвердить что ты не робот

Вернуть Lambda из метода в Java 8?

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

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

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 } 
}
4b9b3361

Ответ 1

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

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

Ответ 2

Вам не хватает полуколонок:

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

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

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

Ответ 3

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

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

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

Ответ 4

Вы можете написать это просто так:

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

Ответ 5

Итак, ответ на 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 atm)