Рубрики
Без рубрики

Лямбда-выражения В Простых Терминах

Лямбда-выражение – это короткий блок кода, который принимает параметры и возвращает значение. Образец… С пометкой программирование, java, новички, лямбда.

Лямбда-выражение – это короткий блок кода, который принимает параметры и возвращает значение. Приведенный ниже пример выражения содержит один параметр. Выражение также может содержать два или более параметра.

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
    ArrayList numbers = 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
    Map prices = 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) {
        List list=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

Некоторые моменты, на которые следует обратить внимание при использовании лямбда-выражения

  • Тело лямбда-выражения может содержать ноль, один или несколько операторов.
  • При наличии одного оператора фигурные скобки не являются обязательными, а тип возвращаемого значения анонимной функции совпадает с типом основного выражения.
  • Если имеется более одного оператора, то они должны быть заключены в фигурные скобки (блок кода), а тип возвращаемого значения анонимной функции совпадает с типом значения, возвращаемого в блоке кода, или недействителен, если ничего не возвращается

Зачем Использовать Лямбда-Выражения

Вот некоторые преимущества использования лямбда-выражений.

  1. Меньше строк кода: Одним из преимуществ использования лямбда-выражения является меньший объем кода.

  2. Поддержка последовательного и параллельного выполнения путем передачи поведения в методах: С появлением Stream API в Java 8 функции могут быть переданы методам сбора, и теперь сбор отвечает за обработку элементов последовательным или параллельным способом.

  3. Более высокая эффективность (использование многоядерных процессоров): Используя потоковый API и лямбда-выражение, мы можем достичь более высокой эффективности (параллельное выполнение) в случае массовых операций с коллекциями. Кроме того, лямбда-выражения могут помочь в достижении внутренней итерации коллекций, а не внешней итерации, как показано в приведенном выше примере. Поскольку в настоящее время у нас есть процессоры с многоядерными процессорами, мы можем воспользоваться преимуществами этих многоядерных процессоров путем параллельной обработки коллекций с использованием лямбды.

Таким образом, лямбда-выражения являются желанным дополнением к любой кодовой базе, и эта статья предназначена только для того, чтобы показать нам, как их использовать и применять.

Оригинал: “https://dev.to/kwereutosu/lambda-expressions-in-simple-terms-46af”