Go to the home page  / Java  / Функциональное программирование  / Лямбда-выражения  / Синтаксис лямбды с параметрами  / Автовыведение типа в параметрах

Автовыведение типа в параметрах

Igor Lazarevsky, 2022.02.05 20:30

Полная запись лямбды с параметрами и их типами выглядит так

Синтаксис с одним параметром

(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());
});
Igor Lazarevsky, 2022.02.05 20:35