ラムダ式ってなに?2で書いたことをいつも通りJavaで書いてみたいと思う。
計算用のラムダ式を用意
前回の記事でScalaで書いた
val add : Int => Unit = x => println(x + 2) val subtract : Int => Unit = x => println(x - 2) val multiply : Int => Unit = x => println(x * 2) val divide : Int => Unit = x => println(x / 2)
これらの式をConsumerインターフェースを用いてJavaで書くと
Consumer<Integer> add = (x) -> {System.out.println(x + 2); }; Consumer<Integer> subtract = (x) -> {System.out.println(x - 2); }; Consumer<Integer> multiply = (x) -> {System.out.println(x * 2); }; Consumer<Integer> divide = (x) -> {System.out.println(x / 2); };
こうなる。
呼び出すときはaccept()メソッドを呼び出していく。
add.accept(2); 4 subtract.accept(2); 0 multiply.accept(2); 4 divide.accept(2); 1
Listの作成
前回と同じようにListを作成するが、イメージしやすいように一度Integer配列として宣言してから変換する。
Integer[] intArray = {1, 2, 3, 4, 5}; List<Integer> array = Arrays.asList(intArray);
forEach()を使ってループ処理を行う
Scalaと同じように、JavaにもforEach()が追加された。
これはCollectionインターフェースに追加されたstream()メソッドを呼び出しStreamインスタンスを取得した後、forEach()メソッドを呼び出す流れになる。
引数は先ほど定義したラムダ式を渡す。
array.stream().forEach(add); 3 4 5 6 7 array.stream().forEach(subtract); -1 0 1 2 3 array.stream().forEach(multiply); 2 4 6 8 10 array.stream().forEach(divide); 0 1 1 2 2
このようにStreamを利用することでラムダ式を使ったループが可能になった。
わかりやすいようにコードの対象箇所と出力結果を分割してまとめたが、実際のコードは以下
import java.util.function.*; import java.util.*; class Lambda{ public static void main(String[] args){ Consumer<Integer> add = (x) -> {System.out.println(x + 2); }; Consumer<Integer> subtract = (x) -> {System.out.println(x - 2); }; Consumer<Integer> multiply = (x) -> {System.out.println(x * 2); }; Consumer<Integer> divide = (x) -> {System.out.println(x / 2); }; Integer[] intArray = {1, 2, 3, 4, 5}; List<Integer> array = Arrays.asList(intArray); array.stream().forEach(add); array.stream().forEach(subtract); array.stream().forEach(multiply); array.stream().forEach(divide); } }
これらを利用することで、Javaでも関数型のパラダイムでコーディングできるようになった。
コメント