Лямбда-выражения в Java
Доброго времени суток! Сегодня мы рассмотрим с Вами лямбда-выражения в языке Java.
Лямбда-выражения в Java сильно напоминают их аналоги — стрелочные функции из JavaScript, и служат для
оптимизации кода.
Основной синтаксис лямбда-выражений в Java следующий:
(параметры) -> инструкция
// или
(параметры) -> { инструкции; }
Объявление типа параметра необязательно — компилятор самостоятельно сможет вывести тип из значения параметра.
Для одного параметра круглые скобки можно не использовать , тогда как для нескольких параметров они обязательны.
Фигурные скобки необязательны, если в теле выражения есть только один оператор. Ключевое слово return также необязательно,
если тело содержит единственное выражение; фигурные скобки необходимы, чтобы указать, что выражение возвращает значение.
Пример:
package ru.example;
import java.util.Arrays;
public class LambdaJavaEx
{
public static void main(String[] args) {
String[] words = { "это", "мой", "сайт", "и", "моя", "страница" };
// сортируем массив, используя лямбда-выражение
Arrays.sort(words, (String str1, String str2) -> (str1.compareTo(str2)));
System.out.println(Arrays.toString(words));
}
}
Популярное предназначение лямбда-выражений в Java — это замена функциональных интерфейсов их менее многословным аналогом.
Функциональный интерфейс в Java — это интерфейс с одним методом.
Пример:
package ru.example;
// функциональный интерфейс
interface CommandExecutor
{
void execute(String command);
}
public class CommandLambdaExecutor
{
public static void main(String[] args)
{
// лямбда выражение совпадает с сигнатурой метода execute функционального интерфеса
CommandExecutor executor = (String command) -> {
System.out.println(msg);
};
executor.execute("java -v");
executor.execute("jar file.jar");
}
}
Общие функциональные интерфейсы
Ввиду того, что функциональный подход пользуется популярностью, то в Java уже есть реализации часто используемых функциональных интерфейсов,
таких как Function, Consumer, or Supplier.
package ru.example;
import java.util.function.Function;
public class LambdaExpressionFun
{
public static void main(String[] args) {
// лямбда-выражение, которое возводит число в куб
// интерфейс Function описывает функцию, которая принимает на вход один параметр и возвращает некоторое значение
Function<Integer, Integer> cube = (Integer x) -> x * x * x;
// вызываем
System.out.println(cube.apply(50));
}
}
Фильтрация данных
Лямбда-выражения очень удобно использовать для различного рода фильтраций
Пример:
package ru.example;
import java.util.List;
import java.util.stream.Collectors;
import static java.lang.System.out;
// определим сущность продукта как запись (укороченная версия класса в Java 16)
record Product(String name, double price) {}
public class FilterProductLambdaEx
{
public static void main(String[] args)
{
List<Product> products = List.of(
new Product("iPhone 15", 1400.99),
new Product("Samsung S12", 1200.99),
new Product("Huawei 15", 1199.50),
new Product("Samsung Galaxy Fold S10", 1999.99)
);
List<Product> result = products.stream()
// фильтруем продукты, оставляя только те, которые включают в названии определенный брэнд и чья стоимость больше 1300
.filter(product -> product.name().toLowerCase().contains("samsung") && product.price() > 1300)
.toList();
result.forEach(out::println);
}
}
Таким образом, мы познакомились в данной статье с овновами лямбда-выражений в Java.