Ламбда изразът е нова и важна функция на Java, която беше включена в Java SE 8. Той предоставя ясен и кратък начин за представяне на един интерфейс на метод с помощта на израз. Много е полезен в библиотеката с колекции. Помага за итериране, филтриране и извличане на данни от колекцията.
Изразът Lambda се използва за осигуряване на изпълнението на интерфейс, който има функционален интерфейс. Спестява много код. В случай на ламбда израз, не е необходимо да дефинираме отново метода за осигуряване на изпълнението. Тук просто пишем кода за изпълнение.
Ламбда изразът на Java се третира като функция, така че компилаторът не създава .class файл.
Функционален интерфейс
Ламбда изразът осигурява реализация на функционален интерфейс . Интерфейс, който има само един абстрактен метод, се нарича функционален интерфейс. Java предоставя анотация @ Функционален интерфейс , който се използва за деклариране на интерфейс като функционален интерфейс.
Защо да използвате ламбда израз
- Да осигури внедряването на функционален интерфейс.
- По-малко кодиране.
Синтаксис на Java Lambda израз
(argument-list) -> {body}
Ламбда изразът на Java се състои от три компонента.
1) Списък с аргументи: Може също да е празен или непразен.
2) Стрелка-жетон: Използва се за свързване на списък с аргументи и тяло на израз.
3) Тяло: Той съдържа изрази и инструкции за ламбда израз.
Синтаксис без параметър
() -> { //Body of no parameter lambda }
Синтаксис на един параметър
конвертиране от char в int java
(p1) -> { //Body of single parameter lambda }
Синтаксис с два параметъра
(p1,p2) -> { //Body of multiple parameter lambda }
Нека да видим сценарий, при който не прилагаме Java ламбда израз. Тук внедряваме интерфейс, без да използваме ламбда израз.
Без ламбда израз
interface Drawable{ public void draw(); } public class LambdaExpressionExample { public static void main(String[] args) { int width=10; //without lambda, Drawable implementation using anonymous class Drawable d=new Drawable(){ public void draw(){System.out.println('Drawing '+width);} }; d.draw(); } }Тествайте сега
Изход:
Drawing 10
Пример за Java Lambda израз
Сега ще приложим горния пример с помощта на Java ламбда израз.
@FunctionalInterface //It is optional interface Drawable{ public void draw(); } public class LambdaExpressionExample2 { public static void main(String[] args) { int width=10; //with lambda Drawable d2=()->{ System.out.println('Drawing '+width); }; d2.draw(); } }Тествайте сега
Изход:
Drawing 10
Ламбда изразът може да има нула или произволен брой аргументи. Да видим примерите:
Пример за ламбда израз на Java: Няма параметър
interface Sayable{ public String say(); } public class LambdaExpressionExample3{ public static void main(String[] args) { Sayable s=()->{ return 'I have nothing to say.'; }; System.out.println(s.say()); } }Тествайте сега
Изход:
I have nothing to say.
Пример за ламбда израз на Java: Единичен параметър
interface Sayable{ public String say(String name); } public class LambdaExpressionExample4{ public static void main(String[] args) { // Lambda expression with single parameter. Sayable s1=(name)->{ return 'Hello, '+name; }; System.out.println(s1.say('Sonoo')); // You can omit function parentheses Sayable s2= name ->{ return 'Hello, '+name; }; System.out.println(s2.say('Sonoo')); } }Тествайте сега
Изход:
Hello, Sonoo Hello, Sonoo
Пример за ламбда израз на Java: множество параметри
interface Addable{ int add(int a,int b); } public class LambdaExpressionExample5{ public static void main(String[] args) { // Multiple parameters in lambda expression Addable ad1=(a,b)->(a+b); System.out.println(ad1.add(10,20)); // Multiple parameters with data type in lambda expression Addable ad2=(int a,int b)->(a+b); System.out.println(ad2.add(100,200)); } }Тествайте сега
Изход:
30 300
Пример за ламбда израз на Java: със или без ключова дума за връщане
В ламбда израза на Java, ако има само един оператор, можете или не можете да използвате ключова дума return. Трябва да използвате ключова дума return, когато ламбда изразът съдържа множество изрази.
interface Addable{ int add(int a,int b); } public class LambdaExpressionExample6 { public static void main(String[] args) { // Lambda expression without return keyword. Addable ad1=(a,b)->(a+b); System.out.println(ad1.add(10,20)); // Lambda expression with return keyword. Addable ad2=(int a,int b)->{ return (a+b); }; System.out.println(ad2.add(100,200)); } }Тествайте сега
Изход:
30 300
Пример за Java Lambda израз: Foreach цикъл
import java.util.*; public class LambdaExpressionExample7{ public static void main(String[] args) { List list=new ArrayList(); list.add('ankit'); list.add('mayank'); list.add('irfan'); list.add('jai'); list.forEach( (n)->System.out.println(n) ); } }Тествайте сега
Изход:
ankit mayank irfan jai
Пример за Java Lambda израз: Множество изрази
@FunctionalInterface interface Sayable{ String say(String message); } public class LambdaExpressionExample8{ public static void main(String[] args) { // You can pass multiple statements in lambda expression Sayable person = (message)-> { String str1 = 'I would like to say, '; String str2 = str1 + message; return str2; }; System.out.println(person.say('time is precious.')); } }Тествайте сега
Изход:
I would like to say, time is precious.
Пример за ламбда израз на Java: Създаване на нишка
Можете да използвате ламбда израз, за да стартирате нишка. В следващия пример прилагаме метод за изпълнение, като използваме ламбда израз.
public class LambdaExpressionExample9{ 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...
Ламбда изразът на Java може да се използва в рамката на колекцията. Той осигурява ефективен и кратък начин за итериране, филтриране и извличане на данни. Следват някои предоставени примери за ламбда и колекция.
Пример за Java Lambda израз: Comparator
import java.util.ArrayList; import java.util.Collections; import java.util.List; 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 LambdaExpressionExample10{ public static void main(String[] args) { List list=new ArrayList(); //Adding Products list.add(new Product(1,'HP Laptop',25000f)); list.add(new Product(3,'Keyboard',300f)); list.add(new Product(2,'Dell Mouse',150f)); System.out.println('Sorting on the basis of name...'); // implementing lambda expression Collections.sort(list,(p1,p2)->{ return p1.name.compareTo(p2.name); }); for(Product p:list){ System.out.println(p.id+' '+p.name+' '+p.price); } } }Тествайте сега
Изход:
Sorting on the basis of name... 2 Dell Mouse 150.0 1 HP Laptop 25000.0 3 Keyboard 300.0
Пример за ламбда израз на Java: Данни за събиране на филтри
import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; 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 LambdaExpressionExample11{ public static void main(String[] args) { List list=new ArrayList(); list.add(new Product(1,'Samsung A5',17000f)); list.add(new Product(3,'Iphone 6S',65000f)); list.add(new Product(2,'Sony Xperia',25000f)); list.add(new Product(4,'Nokia Lumia',15000f)); list.add(new Product(5,'Redmi4 ',26000f)); list.add(new Product(6,'Lenevo Vibe',19000f)); // using lambda to filter data Stream filtered_data = list.stream().filter(p -> p.price > 20000); // using lambda to iterate through collection filtered_data.forEach( product -> System.out.println(product.name+': '+product.price) ); } }Тествайте сега
Изход:
Iphone 6S: 65000.0 Sony Xperia: 25000.0 Redmi4 : 26000.0
Пример за ламбда израз на Java: Прислушвател на събития
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; public class LambdaEventListenerExample { public static void main(String[] args) { JTextField tf=new JTextField(); tf.setBounds(50, 50,150,20); JButton b=new JButton('click'); b.setBounds(80,100,70,30); // lambda expression implementing here. b.addActionListener(e-> {tf.setText('hello swing');}); JFrame f=new JFrame(); f.add(tf);f.add(b); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLayout(null); f.setSize(300, 200); f.setVisible(true); } }
Изход: