読者です 読者をやめる 読者になる 読者になる

Java8新機能 ラムダ式を触ってみました

来年正式版が出るJava8ですが、こちらからDLして昼休みにうわさのラムダ式をちょっと触ってみたので、その殴り書きです。
ちなみにJavadocはこちら

Listの繰り返し

たとえばこんなListがある場合に

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

これまではこんな感じで処理していました。

for (int x : list) {  
    System.out.println(x);  
}

これをJava8で追加されたforEachとか使うと、

list.forEach(new Consumer<Integer>() {
    public void accept(Integer x) {
        System.out.println(x);
    }
});

こう書けます。でもこれはまだラムダ式ではないです。
ここからさらにいろいろと省略することが出来て、最終的には

list.forEach(x->System.out.println(x));

こうなります。

Listの要素をFilter

先ほどのリストから偶数のみを出力したい場合は

list.stream().filter(x->x % 2 == 0).forEach(x->System.out.println(x));

こうです。
最大値を取得する場合は

System.out.println(list.stream().map(x->x).reduce(0, (x, y)->x > y ? x : y));

こう書けますが、最大値取得はよくある処理なので、既にmaxメソッドが用意されており、

System.out.println(list.stream().max( (x, y)->x - y).get());

少し短くなりました。
他にも、Mathクラスを使用して

System.out.println(list.stream().reduce(0, Math::max));

こうも書けます。
今はListの中身がIntegerですが、たとえばPersonクラスのListから最年長の年齢を取得する場合だと

public class Person {
    public String name;
    public int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
List<Person> plist = Arrays.asList(
    new Person("Tanaka", 22),
    new Person("Suzuki", 31),
    new Person("Yamada", 27)
);
System.out.println(plist.stream().map(p->p.age).reduce(0, Math::max));

これで31が出力されます。
年齢だけではなく、Personクラスをとりたい場合は、

Person p = plist.stream().max((p1, p2)->p1.age - p2.age).get();
System.out.println(p.name + "(" + p.age + ")");

こんな感じです。

触ってみて

コードが短く書けるのはうれしいですが、慣れるまでは時間掛かりそうだなと。
ベテランが集まってやるなら良いですが、新人がどんどん入ってくる現場でいきなりラムダ式バリバリなコード渡して直せとか言うのも酷な気がw
でも個人的には好きなので流行って欲しいです。