Содержание
Если вы программист на Java и хотите узнать больше о лямбдах на Java 8, в этой статье мы подробнее рассмотрим синтаксис и использование лямбда-выражений.
лямбда-выражение в Java это краткий способ выразить метод класса в выражении. Имеет список параметров и тело. Тело может быть отдельным выражением или блоком
, Обычно используется там, где требуется реализация интерфейса. Эта необходимость обычно возникает, когда в качестве аргумента для вызова метода требуется интерфейс.
Некоторые простые лямбда-выражения
Давайте посмотрим на несколько простых примеров лямбда-выражений.
Ниже приведено лямбда-выражение, которое принимает два числа x и y и вычисляет сумму.
(int x,int y) -> x + y;
Удалите типы параметров для более краткого представления:
(x, y) -> x + y;
Определите функцию, которая не принимает параметров:
() -> 404;
Следующее также верно, которое не принимает никаких параметров и ничего не возвращает:
() -> {}
Нет необходимости в параграфах, включающих параметры для одного параметра:
x -> x + 1
Более сложные кодовые блоки также возможны. Следующая лямбда принимает однострочный параметр и выполняет его обработку. Обратите внимание, что тип параметра определяется из окружающего контекста:
line -> {
String[] x = pattern.split(line);
return new Player(Integer.parseInt(x[0]),
x[1],
x[2],
x[3],
Integer.parseInt(x[4]));
}
Чистое и краткое кодирование
Использование лямбда-выражений помогает сделать ваш код чистым и лаконичным. Чтобы помочь в этом, классы Java 8 широко используют лямбды.
Цикл по списку или набору
Классы коллекций, такие как List, Set, Queue и другие, реализуют интерфейс Iterable, который значительно упрощает циклический просмотр элементов.
Объявите список имен.
List names = Arrays.asList("Joe", "Jack", "James", "Albert");
Перебрать список без лямбды:
for (String name : names) {
System.out.println(name);
}
Используя лямбду, вышеприведенный цикл можно записать так:
names.forEach(name -> System.out.println(name));
С помощью ссылок на методы Java 8 вышеприведенное можно записать еще более кратко, как:
names.forEach(System.out::println);
Зацикливание на карте
Карта — это отображение ключей к значениям. Циклы по карте включают в себя циклы по каждому отображению (ключ, значение). Сравните, как вы можете использовать лямбды для этой ситуации.
Сначала определите карту:
Map map = new HashMap();
map.put("Atlanta, Georgia", 110);
map.put("Austin, Texas", 115);
map.put("Baltimore, Maryland", 105);
map.put("Birmingham, Alabama", 99);
map.put("Boston, Massachusetts", 98);
Вы можете перебрать эту карту традиционным способом:
for (Map.Entry e : map.entrySet()) {
System.out.println(e.getKey() + " => " + e.getValue());
}
Вот как вы можете сделать то же самое быстро и кратко, используя лямбды:
map.forEach((k, v) -> System.out.println(k + " => " + v));
Функциональные интерфейсы
Каков тип возврата лямбда-выражения? Другими словами, каков тип X в следующем утверждении?
X x = a -> a + 1;
Тип возврата лямбда-выражения — это функциональный интерфейс — интерфейс с одним абстрактным методом. Вы можете назначить лямбда-выражение интерфейсу с помощью совместимого абстрактного метода. Некоторые примеры ниже.
Создание многопоточной задачи
Рассмотрите возможность создания задачи для выполнения в отдельном потоке.
— вам необходимо определить задачу как интерфейс Runnable и реализовать метод run (). Здесь Runnable — это функциональный интерфейс.
class MyTask implements Runnable {
...
public void run() {
// implement your task here
System.out.println("Running in a separate thread now.");
}
...
}
Затем вы можете создать экземпляр класса MyTask и использовать его для запуска нового потока выполнения.
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();
Используя лямбду, процесс создания Runnable становится намного проще. Приведенное выше определение задачи можно переписать так:
Runnable task = () -> System.out.println("Running in a separate thread now.");
Или даже:
Thread thread = new Thread(() -> System.out.println("Running in a separate thread now."));
thread.start();
Сравнение с использованием компаратора
Компаратор — это функциональный интерфейс для сравнения объектов заданного типа. Он определяет единственный абстрактный метод Compare (), который можно определить с помощью лямбда-выражения.
Вот лямбда-выражение, создающее компаратор, используемый для сравнения строк без учета регистра.
Comparator cmp = (x, y) -> x.compareToIgnoreCase(y);
После создания экземпляра функционального интерфейса Comparator его можно повторно использовать по мере необходимости.
Здесь мы сортируем список строк в порядке возрастания.
List names = Arrays.asList("Joe", "Jack", "James", "Albert");
Collections.sort(names, cmp);
names.forEach(System.out::println);
// prints
Albert
Jack
James
Joe
Приведенный выше список отсортирован по месту. Теперь мы можем искать его с помощью метода binarySearch () следующим образом:
System.out.println("search(Joe):" + Collections.binarySearch(names, "Joe", cmp));
# prints
search(Joe):3
Вычислять максимум и минимум из списка также легко, используя лямбды.
Определите некоторые данные:
List temps = Arrays.asList(110, 115, 105, 99, 98, 54, 109, 84, 81, 66, 72, 135, 115, 75, 82, 90, 88);
Используйте лямбда-выражение для определения компаратора:
Comparator cmpTemp = (x, y) -> Integer.compare(x, y);
И выведите максимум и минимум:
System.out.println("------ Max/Min ------");
System.out.println(Collections.max(temps, cmpTemp) + "/" + Collections.min(temps, cmpTemp));
Используйте в программировании GUI
Лямбда-выражения также чрезвычайно полезны в программировании GUI для реализации обработчиков событий. Вот пример использования обработчика нажатия кнопки.
JButton button = new JButton("Click Me");
button.addActionListener(e -> System.out.println("Button clicked!"));
И это был быстрый взгляд на использование лямбд в Java 8.
Лямбды облегчили вашу жизнь с Java 8? Пожалуйста, объясните в комментариях ниже.