Краткое введение в Java 8 Lambdas

Если вы программист на 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? Пожалуйста, объясните в комментариях ниже.

Ссылка на основную публикацию
Adblock
detector