Многослойный лямбда-компаратор

Я начинаю с лямбда-выражений в Java, и есть что-то, что я считаю причудливым, и я уверен, что я делаю что-то неправильно или у него есть обходное решение.

Чтобы определить компаратор, я могу сделать:

 col.setComparator((CustomCell o1, CustomCell o2) ->
            ((Comparable) o1.getValue()).compareTo(o2.getValue())
        );

Это здорово, если я просто добавлю два "{". Я получаю ошибку компиляции:

 col.setComparator((CustomCell o1, CustomCell o2) -> {
            ((Comparable) o1.getValue()).compareTo(o2.getValue());
        });

Ошибка не связана с "{", но < <22 > :

The method setComparator(Comparator<CustomCell>) in the type 
TableColumnBase<CustomParentCell,CustomCell> is not applicable for the arguments 
((CustomCell o1, CustomCell o2) -> {})

Я попытался использовать многострочные операторы раньше для actionevents, и он работает:

 setOnAction(event -> {
        // do something
 });

Это потому, что у него есть только один аргумент?

Ответ 1

Метод, который вы реализуете с помощью setOnAction,

public void handleEvent(ActionEvent event) ;

Он имеет тип возврата void: т.е. он ничего не возвращает:

Метод, реализуемый с помощью setComparator,

public int compare(CustomCell cell1, CustomCell cell2) ;

который возвращает значение. Чтобы использовать более длинную форму, у вас должен быть явный оператор return для методов, возвращающих значение:

col.setComparator((CustomCell o1, CustomCell o2) -> {
        return ((Comparable) o1.getValue()).compareTo(o2.getValue());
    });