インタフェースを実装したクラスを引数に渡す場合に、わざわざクラスを新規に作らなくても書ける仕組み。
例えば、Listを整列するとする。sortメソッドで整列を行う。
Listlist = 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) );
list.sort((a, b) -> b.getId().compareTo(a.getId()) );