logo

Java 람다 표현식

람다 표현식은 Java SE 8에 포함된 Java의 새롭고 중요한 기능입니다. 표현식을 사용하여 하나의 메소드 인터페이스를 표현하는 명확하고 간결한 방법을 제공합니다. 컬렉션 라이브러리에 매우 유용합니다. 컬렉션에서 데이터를 반복, 필터링 및 추출하는 데 도움이 됩니다.

Lambda 표현식은 기능적 인터페이스가 있는 인터페이스 구현을 제공하는 데 사용됩니다. 많은 코드가 절약됩니다. 람다 식의 경우 구현을 제공하기 위해 메서드를 다시 정의할 필요가 없습니다. 여기서는 구현 코드를 작성합니다.

Java 람다 표현식은 함수로 처리되므로 컴파일러는 .class 파일을 생성하지 않습니다.

기능적 인터페이스

람다 표현식은 다음의 구현을 제공합니다. 기능적 인터페이스 . 추상 메소드가 하나만 있는 인터페이스를 기능적 인터페이스라고 합니다. Java는 @ 주석을 제공합니다. 기능적 인터페이스 , 인터페이스를 기능적 인터페이스로 선언하는 데 사용됩니다.


람다 표현식을 사용하는 이유

  1. Functional 인터페이스 구현을 제공합니다.
  2. 코딩이 적습니다.

Java 람다 표현식 구문

 (argument-list) -> {body} 

Java 람다 표현식은 세 가지 구성 요소로 구성됩니다.

np 도트

1) 인수 목록: 비어 있거나 비어 있지 않을 수도 있습니다.

2) 화살표 토큰: 인수 목록과 표현식 본문을 연결하는 데 사용됩니다.

3) 본체: 여기에는 람다 식에 대한 식과 문이 포함되어 있습니다.

매개변수 구문 없음

 () -> { //Body of no parameter lambda } 

단일 매개변수 구문

자바 배열 정렬
 (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 람다 표현식 예

이제 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 

람다 식에는 인수가 0개일 수도 있고 개수에 제한이 없을 수도 있습니다. 예제를 살펴보겠습니다:

자바 디자인 패턴

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 람다 표현식 예: return 키워드 포함 또는 제외

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 람다 표현식 예: 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 람다 표현식 예: 여러 문

 @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 람다 표현식 예: 스레드 생성

람다 표현식을 사용하여 스레드를 실행할 수 있습니다. 다음 예제에서는 람다 식을 사용하여 run 메서드를 구현합니다.

인터넷의 단점
 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 람다 표현식 예: 비교기

 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); } } 

산출:

Java Lambda 이벤트 처리 예