Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Почему в лямбда выражении не получается поставить фигурные скобки?

#java #javafx


Есть работающий код:

bExchColumn.setCellFactory(column -> EditCell.createStringEditCell());


При попытке вставить фигурные скобки в лямбда-выражение ...

bExchColumn.setCellFactory(column -> {EditCell.createStringEditCell();});


eclipse ругается:


  The method setCellFactory(CallBack,TableCell>)
  in the type TableColumn is not applicable for the
  arguments (( column) -> {})"


В чем ошибка и как исправить?
    


Ответы

Ответ 1



Цитаты из урока Oracle по лямбдам (расставил акценты и перевёл). В разделе "из чего состоит лямбда": A body, which consists of a single expression or a statement block. Тело, состоящее из единственного выражения или блока инструкций. Обращаю внимание, что "блок инструкций" это набор инструкций в {}. Далее: If you specify a single expression, then the Java runtime evaluates the expression and then returns its value. Alternatively, you can use a return statement Если указать единственное выражение, рантайм Java вычислит это выражение и вернёт его значение. Или же можно использовать инструкцию return Посему, вот два равноценных примера: p -> выражение p -> { return выражение; } Вы же написали p -> { выражение; }, которое им не эквивалентно и ничего не возвращает.

Ответ 2



До полноценной лямбды не хватает return: {return EditCell.createStringEditCell();}

Ответ 3



Метод bExchColumn.setCellFactory() ожидает какой-то аргумент, который должно вернуть лямбда-выражение. В вашем работающем варианте в качестве аргумента используется значение, возвращенное методом EditCell.createStringEditCell() (потому что лямбда состоит из него одного), а во втором варианте этот метод - часть тела лямбда-выражения, а его результат не возвращается из лямбды, а игнорируется (не присваивается ничему и не возвращается).

Комментариев нет:

Отправить комментарий