ラムダ式ってなに?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でも関数型のパラダイムでコーディングできるようになった。
コメント