cleanUrl: /posts/favor-the-use-of-standard-functional-interfaces

Java 에서 Lambda 를 사용해봅시다

현재 재직중인 회사에 입사할때 까지만해도 저는 python 을 주 언어로 사용하고 있었습니다. python 과 람다는 상당히 가까운 친구였지만, 당시엔 데이터 분석을 할 때나 Lambda 를 사용한다. 따라서 웹개발자인 저 같은 경우는 그닥 필요하지 않다 라는 의견이 많았어서 안그래도 공부할게 많은데 무슨 람다까지 해? 라는 안일한 생각으로 람다를 공부하지 않았습니다.

하지만, 동료들로 인해 람다에 접근하게 되면서 저의 코드는 놀랍도록 간력해지고, 자꾸만 보고 싶고 읽고싶은 코드가 되어가는게 너무 기쁘다보니 람다를 깊히있게 공부해봐야겠다는 생각을 하게 되었습니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6b78e9a7-2c9b-4ae6-b890-afd9884c7d4b/Untitled.png

참고

이 포스팅은 Functional interface with lambda expression java 8 를 번역함과 동시에 저의 경험과 생각이 함께 작성된 글 입니다.

1. Overview

이 포스트에서는 functional interface 와 자바8의 람다 표현식에 대해 다룹니다.

2. Functional Interface 란 무엇인가?

Functional interface 란 abstract method 와 몇몇의 static method 와 default method 가 추가된 인터페이스입니다. java8 에서 추가되면서 우리에게 일상적인 코드를 제거할 수 있게 만들었습니다.

그런데 interface 에 메소드가 있다는게 이상합니다.

public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

제가 자주 사용하는 Predicate 인데 내부적으로 static, default method 가 포함되어 있습니다.

이것을 interface 로 정의하기 위해서 @FunctionalInterface annotation 을 사용해야 합니다. 그리고 만약 @FunctionalInterface 가 붙어있다면, 최소한 하나의 abstract method 가 포함되어야 합니다.

그렇다고 해서 FunctionalInterface 를 정의할때 반드시 @FunctionalInterface 를 사용해야 하는것은 아닙니다.

Functional Interface 를 Annotaion 없이 정의하는 방법.

interface Addition{
    public void add(int a,int b);
}

Functional Interface 를 Annotaion 과 함께 정의하는 방법

@FunctionalInterface
interface Addition{
    public void add(int a,int b);
}