거꾸로 바라본 세상
반응형

[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
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!