Javaでラムダ式を使う2

Java

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

コメント

タイトルとURLをコピーしました