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
でも個人的には好きなので流行って欲しいです。