Шаг 114.
Язык программирования Java.
Примеры использования лямбда-выражений

На этом шаге мы приведем примеры использования лямбда-выражений

С приходом лямбда-выражений и функциональных интерфейсов можно писать тексты программ в более удобном виде. Рассмотрим несколько примеров демонстрирующие мощь лямбд.

Пусть у нас есть список пользователей. Данный список формируется в функции getUsers и после этого возвращается. Информацию о пользователе записывается в объекте типа User. Мы хотим отсортировать список по какому-то признаку. Например, по имени пользователя. Получить имя пользователя можно функцией getName объекта типа User. Решить поставленную задачу можно следующим образом:

...
List<User> users = getUsers();
Collections.sort(users, Comparator.comparing(o -> o.getName()));
...

Функция comparing принимает лямбда выражение, которое будет вызываться на каждом элементе списка users. В нашем случае это функция getName.

На передаче функции лямбда-выражения в качестве аргумента возможности Java не заканчиваются. С приходом функциональных интерфейсов можно передавать ссылку на функцию. Все дело в том, что в Java 8 любая функция представляется в виде объекта. Применим ссылку на функцию getName в предыдущем примере:

...
List<User> users = getUsers();
Collections.sort(users, Comparator.comparing(User::getName));
...

User::getName в данном фрагменте программы является ссылкой на метод getName объекта типа User. Java понимает, что во время прохода по списку пользователей, у очередного элемента списка будет вызвана функция getName.

Очень часто стоит задача сделать что-то со списком, проходя по нему и посещая каждый его элемент. В Java для этого есть функция forEach, которая принимает значение типа Consumer<? super E>.

Например, пусть у нас опять есть список пользователей, и мы хотим сделать вывод данного списка. Сделать это с помощью данной функции можно следующим образом, используя при этом ссылку на метод println:

...
List<User> users = getUsers();
users.forEach(System.out::println);
...

Пусть у нас есть список имен пользователей. Мы хотим создать список пользователей с этими именами. Сделать это можно следующим образом:

...
private List<User> map(List<String> names, Function<String, User> function) {
    List<User> result = new ArrayList<>();
    names.forEach(s -> result.add(function.apply(s)));
    return result;
}
...
List<String> names = Arrays.asList("name1", "name2", "name3");
List<User> users = map(names, User::new);
...

В данном примере приведена функция map, которая принимает список имен и функцию. Проходит по списку имен с помощью функции forEach и добавляет в результирующий список то, что вернет функция apply. Обратим внимание на то как вызывается функция map, а точнее на ее второй аргумент. В Java помимо передачи ссылки на функцию другой функции можно передавать ссылку на конструктор класса. Но тут есть одно ограничение. Так как мы указали тип второго аргумента Function, то такой конструктор должен быть только с одним аргументом.

На следующем шаге мы начнем знакомиться со Stream Api

Предыдущий шаг Содержание Следующий шаг