Можно ли вернуть Comparator из java.util.function.Function в Java?

Я попробовал это в следующем (надуманном) примере, но Eclipse сообщает мне о синтаксической ошибке ("Синтаксическая ошибка в токене "количество страниц", удалите этот токен"):

import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

public class App 
{
    private record Book(Integer nrOfPages) {};
    
    static Function<Integer, Comparator<Book>> byHasExactAmountOfPages = Integer amountOfPages -> (Book book1, Book book2) -> 
    {
         if(book1.nrOfPages.equals(amountOfPages) && book2.nrOfPages.equals(amountOfPages))
         {
             return 0;
         }
         else if(!book1.nrOfPages.equals(amountOfPages) && !book2.nrOfPages.equals(amountOfPages))
         {
             return 0;
         }
         else if(book1.nrOfPages.equals(amountOfPages) && !book2.nrOfPages.equals(amountOfPages))
         {
             return -1;
         }
         else
         {
             return 1;
         }
    };
    
    public static void main(String[] args) 
    {
        List.of(new Book(1), new Book(2), new Book(3)).stream()
            .sorted(byHasExactAmountOfPages.apply(2))
            .forEach(System.out::print);
    }
}
0
nistel 26 Янв 2022 в 15:38
1
Лямбда лямбды сбивает с толку. Представьте, насколько понятнее было бы, если бы вы отказались от использования Function и просто написали static class PageCountComparator implements Comparator<Book> с конструктором, принимающим целочисленный аргумент. (Вы уверены, что хотите использовать Integer, а не int? Действительно ли нормально, чтобы nrOfPages был нулевым?)
 – 
VGR
26 Янв 2022 в 16:18
Спасибо вам за ваши предложения! Я перенесу их в свой актуальный код и сравню обе версии :)
 – 
nistel
26 Янв 2022 в 16:59

1 ответ

Лучший ответ

Вы пропустили скобки вокруг аргумента:

   here                   and here
    ( Integer amountOfPages ) -> (Book book1, Book book2) -> ...
2
udalmik 26 Янв 2022 в 15:44
3
И чтобы объяснить, почему (предположительно) @nistel здесь запутался: если вы опустите тип, и есть только 1 аргумент, вы можете опустить круглые скобки: amountOfPages -> (Book book1, Book book2) -> ....; работает нормально. Но если у вас есть 0 или 2+ аргумента, или вы хотите использовать типы, круглые скобки обязательны.
 – 
rzwitserloot
26 Янв 2022 в 15:58