Java 匿名クラスとラムダ式

匿名クラス

インタフェースを実装したクラスを引数に渡す場合に、わざわざクラスを新規に作らなくても書ける仕組み。

通常のインタフェース利用

例えば、Listを整列するとする。sortメソッドで整列を行う。

	List list = new ArrayList<>();
	list.add(15);
	list.add(8);
	list.add(12);
	
	list.sort(null);
	System.out.println(list);

このとき、sortメソッドに、Comparatorインターフェイスを実装したクラスを渡すことで順番のカスタマイズが出来る。

compareメソッドで引数の2つの要素を比較する。

第一引数が前に来る場合、負の値を返す
第二引数が前に来る場合、正の値を返す
同じ場合、0を返す

※つまり、昇順の場合、「第一引数-第二引数」、降順の場合「第二引数-第一引数」を返すと良い

class MyComparator implements Comparator{

	public int compare(Integer a, Integer b) {
		return b - a;
	}

}

// 以下、main内
	list.sort(new MyComparator());
	System.out.println(list);

匿名クラス

名前を付けて新たにクラスを作ると、名前空間を消耗する。そこで、クラスを作らずに、引数のところに実装内容を書くことが出来る。これを匿名クラス(名前を付けていないクラス)と呼ぶ

// main内
	list.sort(new Comparator(){
		public int compare(Integer a, Integer b) {
			return b - a;
		}
	});

ラムダ式

Comparatorインタフェースは compareメソッド1つが定義されているだけである。
このような場合、ラムダ式を使った方がより簡単に書ける。

ラムダ式利用時

新たなクラスを作る必要は無い。クラスを作る場合に必要になるメソッド1つだけを以下の形で渡す。

 (引数)-> { 処理内容  }

// 以下、main内
		list.sort((a, b) ->{
				return b - a;
		});

これにより、インタフェースを実装したクラスをnewしたことと同じことになる。

なお、一行の場合には、{}は省略できる。{}を省略した場合、return と最後の ; も省略できるので、以下のように書ける。

		list.sort((a, b) -> b - a );

文字列の整列

文字列を整列する場合、compareToメソッドを使うと良い。

		list.sort((a, b) -> b.compareTo(a) );

独自クラスの整列

リスト内に独自クラスを格納している場合、そのクラスのある要素で整列したい場合がある。例えば、Shainクラスのid(String)で整列したい場合、以下のようにする。
		list.sort((a, b) -> b.getId().compareTo(a.getId()) );