Лямбда-выражение – это короткий блок кода, который принимает параметры и возвращает значение. Приведенный ниже пример выражения содержит один параметр. Выражение также может содержать два или более параметра.
parameter -> expression
Лямбда-выражение также можно рассматривать как анонимную функцию. Функция, у которой нет имени и которая не принадлежит ни к какому классу. Лямбда-выражения похожи на методы, но им не нужно имя, и они могут быть реализованы прямо в теле метода.
(parameter1, parameter2) -> expression
Концепция лямбда-выражения была впервые введена в языке программирования LISP. Выражения ограничены. Они должны немедленно возвращать значение, и они не могут содержать переменные, назначения или операторы, такие как если
или для
. Для выполнения более сложных операций можно использовать блок кода с фигурными скобками.
(parameter_list) -> {function_body}
Если лямбда-выражение должно возвращать значение, то блок кода должен содержать оператор return.
Компоненты Лямбда-Выражения
Лямбда-выражения обычно содержат эти 3 компонента:
Список аргументов : Этот аргумент обычно представляет собой список. Он также может быть пустым или непустым.
Стрелка-жетон : Он используется для связывания аргументов-списка и тела выражения.
Тело : Содержит выражения и операторы для лямбда-выражения. Тело может быть простым оператором или может содержать блок кода.
Некоторые примеры реализаций и результатов
Для первого примера мы бы начали со списка чисел. Мы собираемся провести пару математических вычислений относительно содержания этого списка.
// A Java program to demonstrate simple lambda expressions import java.util.ArrayList; public class Main { public static void main(String[] args) { // Creating an ArrayList with elements // And add elements{7,4,2} to the list ArrayListnumbers = new ArrayList (); numbers.add(7); numbers.add(4); numbers.add(2); //Using Lambda to print out all elements numbers.forEach( n -> System.out.println(n)); //Using Lambda to print out the double value of each element numbers.forEach( n -> System.out.println(n+n)); //Using Lambda to print all even elements numbers.forEach( n -> {if (n%2 == 0) System.out.println(n);}); } }
В приведенном выше классе Java у нас есть три разных лямбда-выражения.
- Первое выражение выполняет итерацию по списку и выводит каждое значение в новой строке.
- Второй выводит значение каждого элемента плюс сам по себе.
- Третий выводит только четные числа.
Результат 1
7 4 2
Результат 2
14 8 4
Результат 3
4 2
Лямбда-выражение в функциональных интерфейсах.
В следующих примерах мы будем работать с функциональными интерфейсами. Функциональный интерфейс в Java – это интерфейс, содержащий только один абстрактный (нереализованный) метод. Функциональный интерфейс также может содержать методы по умолчанию и статические методы, которые имеют реализацию.
- Функциональные интерфейсы без параметров
interface MyFunctionalInterface { //A method with no parameter public String sayHello(); } public class ExampleOne { public static void main(String args[]) { // lambda expression MyFunctionalInterface message = () -> { return "Hello"; }; System.out.println(message.sayHello()); } }
Выход
Hello
- Функциональные интерфейсы с одним параметром
interface MyFunctionalInterface { //A method with one parameter public String sayHelloName(String str); } public class ExampleTwo { public static void main(String args[]) { // lambda expression MyFunctionalInterface message = (str) -> { return "Hello " + str; }; System.out.println(message.sayHelloName("Joy")); } }
Выход
Hello Joy
- Функциональные интерфейсы с множеством параметров
interface MyFunctionalInterface { //A method with one parameter public String concatStrings(String str1, String str2); } public class ExampleThree { public static void main(String args[]) { // lambda expression MyFunctionalInterface message = (str1, str2) -> { return str1 + str2; }; System.out.println(message.concatStrings("Good ","Day")); } }
Выход
Good Day
Лямбда-выражение в хэш-картах.
Лямбда-выражение также может использоваться в хэш-картах для итерации или выполнения вычислительных изменений элементов карты. Давайте посмотрим на этот пример ниже.
public class HashMapExample{ public static void main(String[] args) { // Creating a HashMap and putting in elements Mapprices = new HashMap<>(); prices.put("Apple", 50); prices.put("Orange", 20); prices.put("Banana", 10); prices.put("Grapes", 40); //Using Lambda to print out all elements, k=key,v=value prices.forEach((k,v)->System.out.println("Fruit: " + k + ", Price: " + v)); } }
Выход
Fruit: Apple, Price: 50 Fruit: Orange, Price: 20 Fruit: Banana, Price: 10 Fruit: Grapes, Price: 40
Лямбда-Выражение Для Запущенных Потоков
Вы можете использовать лямбда-выражение для запуска потоков. В следующем примере мы реализуем метод run с помощью лямбда-выражения.
public class ThreadExample{ public static void main(String[] args) { //Thread Example without lambda Runnable r1=new Runnable(){ public void run(){ System.out.println("Thread1 is running..."); } }; Thread t1=new Thread(r1); t1.start(); //Thread Example with lambda Runnable r2=()->{ System.out.println("Thread2 is running..."); }; Thread t2=new Thread(r2); t2.start(); } }
Выход
Thread1 is running... Thread2 is running...
Лямбда-выражение для сравнения и фильтрации списка коллекций
Лямбда-выражение также можно использовать в качестве компаратора, а также для фильтрации по списку.
class Product{ int id; String name; float price; public Product(int id, String name, float price) { super(); this.id = id; this.name = name; this.price = price; } } public class FilterListExample{ public static void main(String[] args) { Listlist=new ArrayList (); list.add(new Product(1,"Volvo",19000f)); list.add(new Product(3,"Tesla",75000f)); list.add(new Product(2,"Toyota",38000f)); // using lambda to filter data Stream filtered_data = list.stream().filter(p -> p.price > 3000); // using lambda to iterate through collection filtered_data.forEach( product -> System.out.println(product.name+": "+product.price) ); } }
Выход
Tesla: 75000.0 Toyota: 38000.0
Некоторые моменты, на которые следует обратить внимание при использовании лямбда-выражения
- Тело лямбда-выражения может содержать ноль, один или несколько операторов.
- При наличии одного оператора фигурные скобки не являются обязательными, а тип возвращаемого значения анонимной функции совпадает с типом основного выражения.
- Если имеется более одного оператора, то они должны быть заключены в фигурные скобки (блок кода), а тип возвращаемого значения анонимной функции совпадает с типом значения, возвращаемого в блоке кода, или недействителен, если ничего не возвращается
Зачем Использовать Лямбда-Выражения
Вот некоторые преимущества использования лямбда-выражений.
Меньше строк кода: Одним из преимуществ использования лямбда-выражения является меньший объем кода.
Поддержка последовательного и параллельного выполнения путем передачи поведения в методах: С появлением Stream API в Java 8 функции могут быть переданы методам сбора, и теперь сбор отвечает за обработку элементов последовательным или параллельным способом.
Более высокая эффективность (использование многоядерных процессоров): Используя потоковый API и лямбда-выражение, мы можем достичь более высокой эффективности (параллельное выполнение) в случае массовых операций с коллекциями. Кроме того, лямбда-выражения могут помочь в достижении внутренней итерации коллекций, а не внешней итерации, как показано в приведенном выше примере. Поскольку в настоящее время у нас есть процессоры с многоядерными процессорами, мы можем воспользоваться преимуществами этих многоядерных процессоров путем параллельной обработки коллекций с использованием лямбды.
Таким образом, лямбда-выражения являются желанным дополнением к любой кодовой базе, и эта статья предназначена только для того, чтобы показать нам, как их использовать и применять.
Оригинал: “https://dev.to/kwereutosu/lambda-expressions-in-simple-terms-46af”