Consumer

ファンクショナルインターフェース

Consumer<T> 引数あり・戻り値なし。
acceptとandThenメソッドが定義されている。
プリミティブ型用にIntConsumer, LongConsumer, DoubleConsumerが用意されている。
引数二つの場合用にBiConsumerが用意されている。

 

関数を変数のように扱える。

Consumer<Object> cs = arg -> System.out.println(arg);
// Lambdaパラメータが一つの場合は括弧を省略できる。
//Consumer<Object> cs = (arg) -> System.out.println(arg);
cs.accept("Hello World!");   // Hello
cs.accept(1);                // 1 Integerにオートボクシングされる。
cs.accept(BigDecimal.ZERO);  // 0

関数をパラメータのように渡せる。

public void doTest1() {
    DoubleConsumer area = (r) -> System.out.println(r * r * 3.14);
    doTest1Re(area);
}
public void doTest1Re(DoubleConsumer area) {
    area.accept(2);  // 12.56
}

メソッド参照での使用例

Consumer<String> cs = System.out::println;
cs.accept("Hello World!");

BiComsumer : 引数二つ

public void doTest2() {
    BiConsumer<BigDecimal, BigDecimal> bmi =
      (height, weight) -> 
        System.out.println(weight.divide(height.multiply(height), 2, RoundingMode.HALF_UP));
    doTest2Re(bmi);
}
public void doTest2Re(BiConsumer<BigDecimal, BigDecimal> bmi) {
    bmi.accept(new BigDecimal(1.75), new BigDecimal(71));  // 23.18
}

andThen : Consumerをつなげる

public void doTest3() {
    Consumer<Integer> cs1 = i -> System.out.println("i + 1 = " + (i + 1));
    Consumer<Integer> cs2 = i -> System.out.println("i + 2 = " + (i + 2));
    doTest3Re(cs1, cs2);
}
public void doTest3Re(Consumer<Integer> cs1, Consumer<Integer> cs2) {
    Consumer<Integer> cs3 = cs1.andThen(cs2);
    cs3.accept(1);
}
// i + 1 = 2
// i + 2 = 3

プリミティブ型 : IntConsumer, LongConsumner, DoubleConsumber

IntConsumer ic = (i) -> System.out.println(i + i + 2);
ic.accept(3); // 8
LongConsumer lc = (l) -> System.out.println(l * l * 2);
lc.accept(3L); // 18
DoubleConsumer dc = (d) -> System.out.println(d + d / 2);
dc.accept(3.0); // 4.5

 

投稿日: