Мне нужно изменить свой код с целью (цитирую) «сделать анонимный внутренний класс лямбдой».
У меня есть предложение решить эту проблему, но, не зная, как работают лямбда-выражения в 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());
}
});
Какова соответствующая "правильная" версия?
Измените это:
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));