Сделать анонимный внутренний класс лямбдой в Java

Мне нужно изменить свой код с целью (цитирую) «сделать анонимный внутренний класс лямбдой».

У меня есть предложение решить эту проблему, но, не зная, как работают лямбда-выражения в Java, я не знаю, как применить это предложение к моему конкретному случаю, может ли кто-нибудь мне помочь?

Это предложение у меня есть

Это "неправильная" версия:

myCollection.stream().map(new Mapper<String,String>() {
      public String map(String input) {
          return new StringBuilder(input).reverse().toString();
      }
});

А это "правильный" вариант:

myCollection.stream().map(input -> new StringBuilder(input).reverse().toString());

Теперь «неправильная» версия в моем коде такова:

Collections.sort(commits, new Comparator<GitCommit>() {
    // @Override
    public int compare(GitCommit c1, GitCommit c2) {
        return c1.getDate().compareTo(c2.getDate());
        }
    });

Какова соответствующая "правильная" версия?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 341
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Измените это:

Collections.sort(commits, new Comparator<GitCommit>() {
    // @Override
    public int compare(GitCommit c1, GitCommit c2) {
        return c1.getDate().compareTo(c2.getDate());
        }
    });

к

Collections.sort(commits, (c1, c2) -> c1.getDate().compareTo(c2.getDate()));

Вам не нужно использовать Collections.sort вы можете просто вызвать Список по умолчанию method сортировку, а именно:

commits.sort((c1, c2) -> c1.getDate().compareTo(c2.getDate()));

и еще больше упростил, используя ссылку на метод и компаратор interface :

commits.sort(Comparator.comparing(GitCommit::getDate));

О методе сортировки списка по умолчанию:

default void sort(Comparator<? super E> c) Сортирует этот список в соответствии с в порядке, индуцированном указанным Comparator.

Ответ принят как подходящий
Collections.sort(commits, Comparator.comparing(GitCommit::getDate));

или даже

commits.sort(Comparator.comparing(GitCommit::getDate));

В первом случае метод map требует Function. Я предполагаю, что это неправильно из-за Mapper. Код остается недействительным, пока Mapper не расширяется Function. Это путь:

interface Mapper<T, R> extends Function<T, R> {
    default R map(T t) {
        return apply(t);
    }
}
myCollection.stream().map(new Mapper<String,String>() {
    public String apply(String input) {
        return new StringBuilder(input).reverse().toString();
    }
});

Второй случай правильный, и я предполагаю, что ваша цель - упаковать анонимную функцию в:

  • Лямбда-выражение:

    Collections.sort(commits, (c1, c2) -> c1.getDate().compareTo(c2.getDate()));
    
  • Или к ссылке на метод:

    Collections.sort(commits, Comparator.comparing(GitCommit::getDate));
    

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