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