Ламбда израз је нова и важна карактеристика Јаве која је укључена у Јава СЕ 8. Пружа јасан и концизан начин за представљање једног интерфејса метода помоћу израза. Веома је корисна у библиотеци збирке. Помаже у понављању, филтрирању и издвајању података из колекције.
Ламбда израз се користи да обезбеди имплементацију интерфејса који има функционални интерфејс. Штеди много кода. У случају ламбда израза, не морамо поново да дефинишемо метод за пружање имплементације. Овде само пишемо код за имплементацију.
Јава ламбда израз се третира као функција, тако да компајлер не креира .цласс фајл.
Функционални интерфејс
Ламбда израз обезбеђује имплементацију функционални интерфејс . Интерфејс који има само једну апстрактну методу назива се функционални интерфејс. Јава пружа анотацију @ ФунцтионалИнтерфаце , који се користи за декларисање интерфејса као функционалног интерфејса.
Зашто користити Ламбда Екпрессион
- Да обезбеди имплементацију Функционалног интерфејса.
- Мање кодирања.
Синтакса Јава Ламбда експресије
(argument-list) -> {body}
Јава ламбда израз се састоји од три компоненте.
1) Листа аргумената: Такође може бити празан или не празан.
јава иницијализује низ
2) Стрелица-жетон: Користи се за повезивање листе аргумената и тела израза.
3) Тело: Садржи изразе и изјаве за ламбда израз.
Нема синтаксе параметара
() -> { //Body of no parameter lambda }
Синтакса једног параметра
(p1) -> { //Body of single parameter lambda }
Синтакса два параметра
(p1,p2) -> { //Body of multiple parameter lambda }
Хајде да видимо сценарио где не примењујемо Јава ламбда израз. Овде имплементирамо интерфејс без коришћења ламбда израза.
Без Ламбда експресије
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
Пример Јава Ламбда експресије
Сада ћемо имплементирати горњи пример уз помоћ Јава ламбда израза.
@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
Ламбда израз може имати нула или било који број аргумената. Погледајмо примере:
Пример Јава Ламбда израза: Нема параметара
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.
Пример Јава Ламбда израза: један параметар
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
Пример Јава Ламбда израза: више параметара
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
Пример Јава Ламбда експресије: са или без кључне речи ретурн
У Јава ламбда изразу, ако постоји само једна изјава, можете или не морате користити кључну реч ретурн. Морате користити кључну реч ретурн када ламбда израз садржи више изјава.
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
Пример Јава Ламбда израза: Фореацх петља
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
Пример Јава Ламбда израза: више наредби
@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.
Пример Јава Ламбда израза: Креирање нити
Можете користити ламбда израз за покретање нити. У следећем примеру имплементирамо методу рун коришћењем ламбда израза.
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...
Јава ламбда израз се може користити у оквиру колекције. Пружа ефикасан и концизан начин понављања, филтрирања и преузимања података. Следи неколико примера ламбда и колекције.
Пример Јава Ламбда израза: Компаратор
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
Пример Јава Ламбда израза: Подаци за прикупљање филтера
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
Пример Јава Ламбда израза: Слушалац догађаја
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); } }
Излаз: