Полная запись лямбды с параметрами и их типами выглядит так
Синтаксис с одним параметром
(String p1) -> {
// Тело лямбды
} Синтаксис с двумя параметрами
(String p1, String p2) -> {
// Тело лямбды
} где вместо String, понятно, может быть любой тип данных.
Но если тип переменной можно определить исходя из тела лямбды или того, как она используется, то тип параметров можно не указывать и записать просто так
(p1) -> {
// Тело лямбды
} или так
(p1, p2) -> {
// Тело лямбды
} Предположим у нас есть типизированный список. Хранит String
List<String> list = Arrays.asList("Moscow", "New York", "Alma-Ata");Если мы захотим его отсортировать, скажем, по длине строк, то вызовем метод sort
Collections.sort(list, (String p1, String p2) -> {
return Integer.compare(p1.length(), p2.length());
});Давайте посмотим, как в исходниках реализован метод Collections.sort
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}И видим, что компаратор типизирован, как и первый параметр. Что это означает?
Это означает, что метод sort на основании первого параметра list знает, что list хранит только String, а значит и тип параметров p1 и p2 можно опустить:
Collections.sort(list, (p1, p2) -> {
return Integer.compare(p1.length(), p2.length());
});