ファンクショナルインターフェース
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