함수형 인터페이스 기본 (Consumer, Function, Predicate, Supplier, Operator)

반응형
728x90
반응형

함수형 인터페이스 제공

람다 표현식을 쓸 수 있는 인터페이스는 오직 public 메서드 하나만 가지고 있는 인터페이스여야한다. 자바 8에서 이러한 인터페이스를 특별히 함수형 인터페이스라고 부르고, 함수형 인터페이스에서 제공하는 단 하나의 추상 메서드를 함수형 메서드라고 부른다. 인터페이스를 사용해야하는 개발자 입장에서 람다 표현식을 사용하기 위해 메서드가 하나뿐인 인터페이스를 제공해야하는 번거로움을 해결하기 위해 함수형 인터페이스를 만들고 java.util.function 패키지로 제공하고있다.

 

아래 예제 github 주소 : https://github.com/westssun/practicalJava8/tree/master/src/main/java/ch4/%EB%9E%8C%EB%8B%A4%EC%99%80%ED%95%A8%EC%88%98%ED%98%95%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

GitHub - westssun/practicalJava8: [BOOK] Practical modern java8

[BOOK] Practical modern java8. Contribute to westssun/practicalJava8 development by creating an account on GitHub.

github.com

 

 

Consumer 인터페이스

요청받은 내용을 소비한다. = 아무런 값도 리턴하지 않고 요청 받은 내용을 처리한다. (리턴타입 void)

public class ConsumerExample {
    public static void execute(List<String> nameList, Consumer<String> consumer) {
        for (String name : nameList) {
            consumer.accept(name);
        }
    }

    public static Consumer<String> getExpresiion() {
        /* 리턴해주는 것은 '람다식' 자체이다 */
        return (String name) -> System.out.println(name);
    }

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>();
        nameList.add("정수빈");
        nameList.add("김재호호");

        /* 람다 전달 */
        ConsumerExample.execute(nameList, getExpresiion());
    }
}

 

 

 

Function 인터페이스

생성할때 두 개의 제네릭 타입을 정의해야 하며 각각의 이름은 T와 R이다.
해당 인터페이스의 함수형 메서드는 T를 인수로 받아서 R을 리턴하는 apply 메서드를 가지고있다.
특정한 클래스를 파라미터로 받아서 처리한 후 리턴하는 형태이다.
리턴값이 반드시 필요할 경우 사용한다

public class FunctionExample {
    public static int execution (String context, Function<String, Integer> function) {
        return function.apply(context);
    }

    public static void main(String[] args) {
        /* 인수 T : context, 리턴 R : context.length() */
        FunctionExample.execution("Hello", (String context) -> context.length());
    }
}

 

 

Predicate 인터페이스

리턴 타입이 반드시 특정 클래스여야한다. (boolean 타입)
제네릭 타입으로 선언된 객체를 파라미터로 받아서 처리한 후 참/거짓 중 하나를 리턴한다.

public class PredicateExample {
    public static boolean isValid (String name, Predicate<String> predicate) {
        return predicate.test(name);
    }

    public static void main(String[] args) {
        PredicateExample.isValid("", (String name) -> !name.isEmpty());
    }

}

 

 

Supplier 인터페이스

Consumer 인터페이스와 반대이다.
입력 파라미터는 없고 리턴 타입만 존재한다.
입력 없이 출력만 있어서 공급자라는 이름을 사용하였고, get 메서드를 사용할 수 있다.

public class SupplierExample {
    public static String execute(Supplier<String> supplier) {
        return supplier.get();
    }

    public static void main(String[] args) {
        String version = "2.0";
        SupplierExample.execute(() -> {return version;});
    }
}

 

 

 

Operator 인터페이스

모든 Operator 계열의 인터페이스는 Function 인터페이스의 하위 인터페이스이다. 그렇기 때문에 Functional 인터페이스의 함수형 메서드 apply를 그대로 사용하고 상속관계로 인해 Operator 인터페이스를 위한 별도의 함수형 인터페이스는 제공할 수 없다.

 

  • 1) UnaryOperator

하나의 연산을 가진다.

 

  • 2) BinaryOperator

입력 파라미터가 2개인 함수형 메서드를 제공한다.

 

public class OperatorExample {
    public static void main(String[] args) {
        /** UnaryOperator */
        UnaryOperator<Integer> operatorA = (Integer t) -> t * 2;
        System.out.println(operatorA.apply(1));

        /** BinaryOperator */
        BinaryOperator<Integer> operatorB = (Integer a, Integer b) -> a + b;
        System.out.println(operatorB.apply(1, 2));
    }
}

 

 

반응형

Designed by JB FACTORY