Java - BiConsumer 예제

Java 8에서 도입된 BiConsumer의 기본적인 사용 방법 및 예제에 대해서 알아보겠습니다.

1. BiConsumer

BiConsumer는 2개의 인자를 받고 리턴 값이 없는 함수형 인터페이스입니다.

@FunctionalInterface
public interface BiConsumer<T, U> {

    /**
     * Performs this operation on the given arguments.
     *
     * @param t the first input argument
     * @param u the second input argument
     */
    void accept(T t, U u);

}

2. BiConsumer의 구현 방법 및 예제

BiConsumer는 아래와 같이 Lambda 표현식으로 구현할 수 있습니다.

accept() 호출과 함께 인자 2개를 전달하면 람다식의 구현 내용이 수행됩니다.

import java.util.function.BiConsumer;

public class BiConsumerExample1 {

    public static void main(String[] args) {

        BiConsumer<Integer, Integer> biConsumer = (n1, n2) -> System.out.println(n1 * n2);

        biConsumer.accept(10, 20);
    }
}

Output:

200

3. High Order Function과 BiConsumer

High Order Function(고차함수)은 하나 이상의 함수를 인자로 받거나, 함수를 결과로 리턴하는 것을 말합니다.

BiConsumer는 아래와 같이 함수의 인자로 전달할 수 있습니다. 즉, BiConsumer를 통해서 어떤 구현 내용을 다른 함수로 전달하고 함수 내에서 수행시킬 수 있습니다.

import java.util.function.BiConsumer;

public class BiConsumerExample2 {

    public static void main(String[] args) {

        BiConsumer<Integer, Integer> biConsumer = (n1, n2) -> System.out.println(n1 * n2);

        multiply(10, 20, biConsumer);
    }

    static void multiply(Integer n1, Integer n2, BiConsumer<Integer, Integer> biConsumer) {
        biConsumer.accept(n1, n2);
    }
}

Output:

200

4. Map.forEach()와 BiConsumer

Map.forEach()는 인자로 BiConsumer를 받으며, Map의 모든 요소를 순회합니다. Map을 순회할 때 요소들의 key와 value를 BiConsumer의 인자로 전달하며, BiConsumer의 구현 내용이 수행됩니다.

다음과 같이 BiConsumer를 전달하여 Map의 모든 내용을 출력할 수 있습니다.

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

public class BiConsumerExample3 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);
        map.put("three", 3);

        BiConsumer<String, Integer> biConsumer =
                (key, value) -> System.out.println("key: " + key + ", value: " + value);

        map.forEach(biConsumer);
    }
}

Output:

key: one, value: 1
key: two, value: 2
key: three, value: 3

5. andThen()으로 다수의 BiConsumer 연결

andThen()은 BiConsumer들을 연결해주는 Chaining 메소드입니다. 이 함수를 이용하여 다수의 BiConsumer 객체를 순차적으로 수행시킬 수 있습니다.

아래 코드에서 biConsumer1.andThen(biConsumer2).accept(10, 20)를 호출하면 biConsumer1가 먼저 수행되고, 그 다음 biConsumer2가 수행됩니다. 두개의 BiConsumer에는 10과 20이 인자로 전달됩니다.

import java.util.function.BiConsumer;

public class BiConsumerExample4 {

    public static void main(String[] args) {
        BiConsumer<Integer, Integer> biConsumer1 =
                (n1, n2) -> System.out.println("multiply: " + (n1 * n2));

        BiConsumer<Integer, Integer> biConsumer2 =
                (n1, n2) -> System.out.println("sum: " + (n1 + n2));

        biConsumer1.andThen(biConsumer2).accept(10, 20);
    }
}

Output:

multiply: 200
sum: 30

참고로, JDK의 BiConsumer.java에서 andThen()은 다음과 같이 구현되어있습니다.

// BiConsumer.java

default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
    Objects.requireNonNull(after);

    return (l, r) -> {
        accept(l, r);
        after.accept(l, r);
    };
}
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha