개발/Java

Java 기초부터 다시 - interface Consumer<T> , Supplier<T>, Predicate<T>

삽쟁이 2024. 1. 29. 16:34
반응형

1. Consumer<T>

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
    .....

자바8 이후 부터 제공되는 기본 함수형 인터페이스 Consumer<T>은 T 타입의 인자를 받아 이름 그대로 특정 작업(Accept)을 수행 하는 함수형 인터페이스 이다.

 

예제

//Integer 값을 받아, 출력한는 인터페이스
Consumer<Integer> printT = new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
        System.out.println("Consumer 는 리턴값이 없어요.>>>" + integer);
    }
};

//람다 표현
Consumer<Integer> printT = integer -> 
	System.out.println("Consumer 는 리턴값이 없어요.>>>" + integer);

 

특정 값을 인자로 받아 자유롭게 처리가 가능 하다.

 

사용 예제 (기타 Default 메소드)

public class SomethingConsumer implements Consumer<Integer> {
    @Override
    public void accept(Integer integer) {
        System.out.println("SomeThingConSumer Plus 10 >>>>" + integer + 10);
    }
    @Override
    public Consumer<Integer> andThen(Consumer<? super Integer> after) {
        return Consumer.super.andThen(after);
    }
}

andThen: 본체의 Apply를 적용 후, 인자로 받은 Funtion의 Apply 적용.

 

Function의 compose와 addThen처럼 실제 사용을 해보자.

SomethingConsumer plus10 = new SomethingConsumer();
Consumer<Integer> minus10 = (i) -> System.out.println("SomethingConsumer minus10 >>>> " + (i - 10));
Consumer<Integer> multiply2 = (i) -> System.out.println("SomethingConsumer Multiply *2  >>> " + (i * 2));
        
plus10.andThen(minus10.andThen(multiply2)).accept(30);

/**
RESULT
SomeThingConSumer Plus 10 >>>>40
SomethingConsumer minus10 >>>> 20
SomethingConsumer Multiply *2  >>> 60
**/

순서 대로 plus10의 accept > minus10의 accept > multiply2 의 accept가 실행되는 것을 확인할 수 있다.

 

 

2. Supplier<T>

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

자바8 이후 부터 제공되는 기본 함수형 인터페이스 Suppplier<T>은 매개변수를 받지 않고 정의된 T 타입의 변수를 받환하는 추상 메소드 get()을 제공한다.

 

예제

Supplier<Integer> get10 = new Supplier<Integer>() {
            @Override
            public Integer get() {
                System.out.println("Supplier는 파라미터 없이 바로 넘겨요>>>>" + 10);
                return 10;
            }
};

Supplier<String> getString = () -> "Hello World";

System.out.println(get10.get()); // RESULT Integer 10
System.out.println(getString.get()); // RESULT "Hello World"

 

 

2. Predicate<T>

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
    ....

자바8 이후 부터 제공되는 기본 함수형 인터페이스 Predicate<T>은 매개변수 T를 받은 후, 전달된 인자를 사용하여 boolean(true, false)를 반환 하는 인터페이스를 제공 한다.

 

예제

Predicate<Integer> isEven = i -> i%2 == 0;
System.out.println(isEven.test(10)); // RESULT true
System.out.println(isEven.test(7)); // RESULT false
System.out.println(isEven.test(1)); // RESULT false
반응형