こんにちわ、みけです。
Java8初心者勉強会というのを開催してみました。
参加者2人でした。
Java8はだれも興味ないんだなと思いました。
Java8のラムダ式
特にもうこれといって目新しいこともありません。
メソッドが一つだけのインターフェースを記述するときに、
非常に記述が楽になるというものです。
例えば次のようなクラスがあるとします。
Item.jara1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public class Item {
final String name;
final int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
|
上記のItem
クラスをprice
の昇順、name
の昇順でソートするコードは以下のようになります。
1
2
3
4
5
6
7
| List<Item> items = getItemList();
items.sort((left, right) -> {
int priceOrder = left.getPrice() - right.getPrice();
int nameOrder = left.getName().
compareTo(right.getNmae());
return priceOrder != 0? priceOrder : nameOrder;
});
|
ところで、Item
クラスのprice
だとかname
だとかについて、
それをソートするという操作は別に外のクラスが実装しても構わないけど、
Item
クラスが持っている方が何かと便利です。
したがって、オーダーするにあたって、Item
クラスに次のようなメソッドを
持たせるようにします。
Item.java1
2
3
4
5
6
7
8
9
10
| public class Item {
final String name;
final int price;
// 途中省略
public int comparePriceAscNameAsc (Item that) {
int priceOrder = this.price - that.price;
return priceOrder != 0 priceOrder :
this.name.compareTo(that.name);
}
}
|
先ほどのソートをするコードのラムダ式部分は非常に簡単化されます。
1
| items.sort((left, right) -> left.comparePriceAscNameAsc(right));
|
ところで、呼び出されるメソッドはこのケースの場合わかりきっているので、
TODO : この記述は適当に書いているのでドキュメントを読み直します
Method Referenceに変更することが可能です。
1
| items.sort(Item::comparePriceAscNameAsc)
|
という感じで、ラムダ式っぽい記述はなくなりました。
ちなみにMethod and Constructor ReferenceはLambdaの仕様の一部です。