Java 9 ifPresentOrElse возвращает значение

1 / Рабочий код:

public Student process (int id, name){
  Optional<Student> studentOpt = myrepo.findById(id);
  studentOpt.isPresent() {
    return updateStudent(id, name);
  } else {
   return createStudent(id, name);
  }

2 / Я пытаюсь изменить его на «полный лямбда-код» (не работает):

public Student process (int id, name){
  Optional<Student> studentOpt = myrepo.findById(id);
  return studentOpt.ifPresentOrElse(student-> return updateStudent(id, name), () ->  return createStudent(id, name));
}

1 / следует ли мне изменить его на полную лямбду? что самое чистое?

2 / если да, то как?

А что именно означает "не работает"? Пожалуйста, прочтите статью Как спросить, чтобы узнать, как создать вопрос, на который мы действительно можем ответить :)

Zephyr 29.10.2018 06:07

Удалите вызовы return из вызова ifPresentOrElse, и он должен работать. Возможно, вам придется сделать id и name окончательными.

Tim Biegeleisen 29.10.2018 06:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
2
9 387
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая, что ваши методы updateStudent и createStudent включают в себя некоторую форму побочного эффекта, и вы обычно должны предпочесть лямбда-выражения без побочных эффектов, я не рекомендую вам использовать их здесь. Фактически, простого блока if-then-else будет достаточно. Однако, если вам интересно, эквивалентная лямбда будет выглядеть так:

return studentOpt
    .map(unused -> updateStudent(id, name))
    .orElseGet(() -> createStudent(id, name));

Другие вопросы по теме