시뻘건 개발 도전기

Lambda Expression 본문

프로그래밍/JAVA

Lambda Expression

시뻘건볼때기 2022. 7. 6. 15:26
반응형

Oracle에서 제공하는 java 1.8 docs를 살펴보면 상당히 많은 interface가 있다.

그 중에서 Function interface를 살펴보자.

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
    
    // ...
    
}

 

이 인터페이스는 apply라는 하나의 abstract method(FunctionalInterface annotation)를 가진다. 보면 알 수 있겠지만, T 타입의 parameter를 받아 R 타입의 값을 리턴하는 메소드다.

public class Exercise {
    public static void main(String[] args) {
        Function<Integer, String> myEx = new Func();
        System.out.println(myEx.apply(10));
    }
}

class Func implements Function<Integer, String> {
    @Override
    public String apply(Integer integer) {
        return String.valueOf(integer) + "입니다.";
    }
}

 

상기 코드와 같이 Integer를 받아서 String 타입을 리턴하는 함수를 Object 형태로 구현했다.

문제는 이 Object를 필요할 때마다 생성해서 사용해야되나? 뭔가 찝찝하고 좋은 코드처럼 보이지 않는다.

이를 해결하기 위해 Lambda를 제공한다.

 

public class Exercise {
    public static void main(String[] args) {
        Function<Integer, String> myEx = (Integer p1) -> {
            return p1 + "입니다.";
        };
        System.out.println(myEx.apply(10)); // 10입니다.
    }
}

 

Lambda를 사용해서 나타낸다면, Function을 상속받는 class를 생성할 필요가 없어진다.

상기 코드는 Lambda의 기본 형태를 나타내지만 아래와 같이 생략을 할 수 있기때문에 간결함을 더해준다.

public class Exercise {
    public static void main(String[] args) {
        Function<Integer, String> myEx = p1 -> p1 + "입니다.";
        System.out.println(myEx.apply(10)); // 10입니다.
    }
}

Lambda의 생략은 아래와 같이 정리할 수 있다.

  • 매개변수의 타입을 알 수 있을 때 타입 생략 가능
  • 매개변수가 하나일 경우 생략 가능
  • 바로 리턴하는 경우 중괄호 및 'return' 예약어 생략 가능

 

이번엔 BiFunction을 살펴보자. BiFunction은 T 타입과 U 타입을 매개변수로 갖고 R 타입을 리턴하는 apply 메소드를 갖는다.

@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
    
    // ...
    
}

 

public class Exercise {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, String> myEx = (p1, p2) -> "매개변수는 " + p1 + "과 " + p2 + "입니다.";
        System.out.println(myEx.apply(10, 100)); // 매개변수는 10과 100입니다.
    }
}

 

 

이렇게 java에서 두 개의 매개변수를 받는 Function을 제공한다. 그렇다면 3개 이상 필요하다면 어떻게 될까?

이러한 부분은 직접 만들어 사용할 수 있다.

public class Exercise {
    public static void main(String[] args) {
        TriFunction<Integer, Integer, String, String> myEx = (p1, p2, p3) -> "더하면 " + (p1 + p2) + p3;
        System.out.println(myEx.apply(10, 100, "입니다.")); // 더하면 110입니다.
    }
}

@FunctionalInterface
interface TriFunction<T, U, V, R> {
    R apply(T t, U u, V v);
}
반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

Optional  (0) 2022.08.12
Stream  (0) 2022.07.25
Method Reference  (0) 2022.07.14
Functional Interface  (0) 2022.07.06
함수형 프로그래밍  (0) 2022.07.06
Comments