mike、mikeなるままに…

プログラムに関してぬるま湯のような記事を書きます

Java8 Lambda式を使ってみた

こんにちわ、みけです。

Java8初心者勉強会というのを開催してみました。

参加者2人でした。

Java8はだれも興味ないんだなと思いました。

Java8のラムダ式

特にもうこれといって目新しいこともありません。

メソッドが一つだけのインターフェースを記述するときに、

非常に記述が楽になるというものです。

例えば次のようなクラスがあるとします。

Item.jara
1
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.java
1
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の仕様の一部です。