Java 8 - BiConsumer 예제

By JS | Last updated: June 01, 2021

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);

}

1. 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

2. High Order Function

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

3. Map.forEach()

Map.forEach()는 인자로 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

4. andThen()

andThen()은 BiConsumer들을 연결해주는 Chaining 메소드입니다.

아래 코드에서 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

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);
    };
}

References

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha