トッカンソフトウェア

ラムダ式


ラムダ式はJava8で導入された新しい記述方法です。
JavaScriptやC#など他言語にもある書き方で、記述量が少し減ります。
Streamと組み合わせるとさらに記述量が減ります。

通常のインターフェース→無名クラス→ラムダ式

まずは通常のインターフェースの実装のサンプル。
				
package javaTest2;

interface TestIf {
	public String exec(String str);
}

class TestClass implements TestIf {
	public String exec(String str) {
		return "Hello " + str;
	};
}

public class Test {

	public static void main(String[] args) {

		// 通常のインターフェースからクラスを実装
		TestIf it = new TestClass();
		System.out.println(it.exec("World"));
	}

}

			
無名クラスを使用して記述量を少し減らした書き方。
				
package javaTest2;

interface TestIf {
	public String exec(String str);
}

public class Test {

	public static void main(String[] args) {

		// 無名クラス
		TestIf it = new TestIf() {
			@Override
			public String exec(String str) {
				return "Hello " + str;
			}
		};
		System.out.println(it.exec("World"));
	}

}

			
ラムダ式を使用して記述量をさらに減らした書き方。
				
package javaTest2;

interface TestIf {
	public String exec(String str);
}

public class Test {

	public static void main(String[] args) {

		// public String exec(String str) が  str -> と略して書くことができる。
		TestIf it = str -> {
			return "Hello " + str;
		};
		System.out.println(it.exec("World"));
	}

}

			
ラムダ式で戻り値がないもの。
				
package javaTest2;

interface TestIf {
	public void exec(String str);
}

public class Test {

	public static void main(String[] args) {

		// 戻り値がなく、returnもない場合、{}も省略できる
		TestIf it = str -> System.out.println("Hello " + str);

		it.exec("World");
	}

}

			
ラムダ式で引数がないもの。
				
package javaTest2;

interface TestIf {
	public void exec();
}

public class Test {

	public static void main(String[] args) {

		// 引数なしは()を書く
		TestIf it = () -> System.out.println("Hello World");

		it.exec();
	}

}


			
ラムダ式で引数が複数。
				
package javaTest2;

interface TestIf {
	public void exec(String str1, String str2);
}

public class Test {

	public static void main(String[] args) {

		// 引数が複数ある場合は()で囲む
		TestIf it = (str1, str2) -> System.out.println(str1 + " " + str2);

		it.exec("Hello", "World");
	}

}


			
既存のクラスでもラムダ式が使えるようになっているものがある(無名クラス)。
				
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Sort {

	public static void main(String[] args) {
		List<String> ary = new ArrayList<>();
		ary.add("1");
		ary.add(null);
		ary.add("a");
		ary.add("0");

		// 無名クラスで記述
		Collections.sort(ary, new Comparator<String>() {
			@Override
			public int compare(String a, String b) {

				if (a == null && b == null)
					return 0;
				else if (a == null)
					return -1;
				else if (b == null)
					return 1;
				else
					return a.compareTo(b);
			}
		});

		for (String st : ary) {
			System.out.println(st);
		}
	}
}


			
既存のクラスでもラムダ式が使えるようになっているものがある(ラムダ式)。
また新しいfor文も使えるようになりforEach)、その中でラムダ式やメソッド参照を指定できる。
メソッド参照はラムダ式でさらに記述を減らしたもの。呼び出しているメソッドの引数と呼び出されているメソッドの引数が同じ場合、引数を省略できる。メソッド参照は、メソッドの::で指定する。
				
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Sort {

	public static void main(String[] args) {
		List<String> ary = new ArrayList<>();
		ary.add("1");
		ary.add(null);
		ary.add("a");
		ary.add("0");

		// ラムダ式で記述
		Collections.sort(ary, (a, b) ->  {

			if (a == null && b == null)
				return 0;
			else if (a == null)
				return -1;
			else if (b == null)
				return 1;
			else
				return a.compareTo(b);
		});

		// 新しいfor文。()の中にラムダ式が掛ける
		ary.forEach(st -> System.out.println(st));

		// メソッド参照
		ary.forEach(System.out::println);
	}
}


			
新しいfor文の使い方はこんな感じ。
				
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Sort {

	public static void main(String[] args) {
		List<String> ary = new ArrayList<>();
		ary.add("1");
		ary.add(null);
		ary.add("a");
		ary.add("0");

		Map<String, String> map = new HashMap<>();
		map.put("a", "aaa");
		map.put("b", "bbb");

		// 新しいfor文。()の中にラムダ式が掛ける
		ary.forEach(st -> System.out.println(st));

		// 新しいfor文。()の中にラムダ式が掛ける
		map.forEach((key, val) -> System.out.println(key + "-" + val));
	}
}


			


ページのトップへ戻る