반응형
[Java] Lamda Expressions(람다식)
람다식은 Anonymous Founction(익명 함수)
를 생성하기 위한 식으로 함수형 인터페이스를 구현하기 위해 자바 8에서 도입한 표현식이다.
장점
- 자바 코드가 간결해진다.
- 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다.
람다식의 형태
람다식의 형태는 매개변수를 가진 코드블록이지만 런타임 시에는 익명 구현 객체를 생성한다.
람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체
public interface func<T, U> {
U apply(T data);
}
익명 클래스 문법
new 인터페이스 이름() {
반환타입 메서드명 (인자) {
실행문
}
};
람다식과 익명 클래스의 차이점
람다식과 익명클래스의 차이점은 람다식에서 사용되는 this가 가리키는 대상 이다. 익명클래스의 this는 구현한 인터페이스의 인스턴스를 나타내고, 람다식의 this는 람다식을 구현한 클래스의 인스턴스를 나타낸다.
- 익명클래스로 구현한 것과 람다식으로 구현한 차이
//익명클래스로 구현
BiFunction<Integer, Integer, BigDecimal> function1 = new BiFunction<Integer, Integer, BigDecimal>() {
@Override
public BigDecimal apply(Integer value1, Integer value2) {
return new BigDecimal(value1 + value2);
}
};
//람다식으로 구현
BiFunction<Integer, Integer, BigDecimal> function2 (value1, value2) -> new BigDecimal(value1 + value2);
//람다식으로 구현
BiFunction<Integer, Integer, BigDecimal> function3 = (value1, value2) -> {
return new BigDecimal(value1 + value2);
};
람다식을 사용하면 구현해야 할 인터페이스나 메서드의 선언을 생략하고 인자와 실행문만 작성하면 되고, 인자의 타입과 return등 세세한 부분 까지도 생략할 수 있다.
[DifferenceOfThis.java]
import io.reactivex.functions.Action;
public class DifferenceOfThis {
public static void main(String[] args) throws Exception {
new DifferenceOfThis().execute();;
}
/**
* 익명 클래스와 람다식의 this 차이
*/
public void execute() throws Exception {
//익명클래스
Action annoymous = new Action() {
@Override
public void run() throws Exception {
System.out.println("익명 클래스의 this : "+ this);
}
@Override
public String toString() {
return "익명클래스 this는 인터페이스의 인스턴스";
}
};
//람다식
Action lamda = () -> System.out.println("람다식의 this : "+ this);
annoymous.run();
lamda.run();
}
@Override
public String toString() {
return "람다식 this는 람다식을 구현한 클래스의 인스턴스";
}
}
기존 Runnable의 인터페이스 익명 구현 객체 생성 방법
Runnable runnable = new Runnable() {
public void run() {
//...
}
}
람다식을 이용한 Runnable의 인터페이스 익명 구현 객체 생성 방법
Runnable runnable = () -> {
//...
}
람다식은 (매개변수)->{실행코드}
형태로 작성할 수 있다.
기본문법
(매개변수, ...) -> {실행문; ...};
- 매개변수의 이름은 자유롭게 정의할 수 있으면
->
는 매개변수룰 이용하여{...}
를 실행한다는 의미가 된다. (int a) -> { System.out.prinltn(a); }
- 개개변수 타입은 런타임 시 대입되는 값에 따라서 자동으로 인식될 수 있으므로 타입을 언급할 필요는 없다.
(a) -> { System.out.println(a); }
- 하나의 매개변수만 있다면
()
를 생략할 수 있으며, 하나의 실행문만 있다면{}
도 생략 가능하다. a -> System.out.println(a)
OR(a) -> System.out.println(a)
- 매개변수가 없을 경우
()-> {실행문}
형식으로 사용한다. - 중괄호
{}
를 실행하고 결과를 리턴해야한다면 return문으로 결과 값을 지정할 수 있다.(x, y) -> { return x + y }
- 중괄호
{}
에 return 문만 있다면, return문 없이 리턴 할 수 있다.(x, y) -> x + y
람다식은 함수형 인터페이스 구현에 필요한 최소 정보만으로 구현할 수 있다.
기본.1
//기본문법
(인자, ...) -> {
실행문
}
기본.2
(타입 인자, ...) -> {
실행문
return 반환 값
}
인자가 없는 메서드
() -> {
return (int) (Math.random() * 10);
}
인자가 1개밖에 없는 메서드
value -> {
return value * 10;
}
return문만 있는 실행문
value -> value * 10
실행문이 1개로 이루어져 있는 메서드
value -> System.out.println(value);
반응형
'Language > Java' 카테고리의 다른 글
[Reactive Programming] RxJava 개념 (0) | 2023.04.26 |
---|---|
[Reactive Programming] Reactive System(리액티브 시스템) (0) | 2023.04.26 |
[Java] Generic(제네릭) (0) | 2023.04.20 |
[병렬프로그래밍] 6. 작업실행 (0) | 2017.04.25 |
volatile 키워드 (0) | 2017.04.13 |