今朝から作ったプログラムを Lambda を使うように変更しようといろいろ調べてた。
そしたら以前 Fork/Join フレームワークについて調べていたときに発見したコードを目にした。
確か IBM のサイトにあった記事だがどうやらちょくちょくサンプルにあがってくるコードらしい。
日本語で Lambda の解説をしてくれているサイトにもあった。
ある年の学生のハイスコアを見つけ出すプログラムだ。
それを参考にしてこんなプログラムを組んでみた。
一番大きなバストを調べるプログラムだ。
ただし年齢制限を設けた。
16歳以上、26歳未満だ。
Java 7 でのコードは次のようになります。
| jp\yucchi\hello_lambda_2\Hello_Lambda_2.java |
package jp.yucchi.hello_lambda_2;
import java.util.ArrayList;
import java.util.List;
public class Hello_Lambda_2 {
public static void main(String[] args) {
List ladies = new ArrayList<>();
ladies.add(new Lady(80, 20));
ladies.add(new Lady(70, 14));
ladies.add(new Lady(85, 30));
ladies.add(new Lady(90, 24));
ladies.add(new Lady(100, 10));
int maxBust = 0;
for (Lady l : ladies) {
if (l.age > 15 && l.age < 26) {
if (l.bustSize > maxBust) {
maxBust = l.bustSize;
}
}
}
System.out.println("16歳以上、26歳未満で一番大きな胸のサイズは" + maxBust + "です。");
}
private static class Lady {
int bustSize;
int age;
public Lady(int bustSize, int age) {
this.bustSize = bustSize;
this.age = age;
}
}
}
実行結果は
run:
16歳以上、26歳未満で一番大きな胸のサイズは90です。
構築成功 (合計時間: 0 秒)
期待通りの結果となります。
次にこれを Lambda を使ってみます。
| jp\yucchi\hello_lambda_2\Hello_Lambda_2.java |
package jp.yucchi.hello_lambda_2;
import java.util.ArrayList;
import java.util.List;
public class Hello_Lambda_2 {
public static void main(String[] args) {
List ladies = new ArrayList<>();
ladies.add(new Lady(80, 20));
ladies.add(new Lady(70, 14));
ladies.add(new Lady(85, 30));
ladies.add(new Lady(90, 24));
ladies.add(new Lady(100, 10));
int maxBust = ladies.filter(l -> l.age > 15 && l.age < 26)
.map(l -> l.bustSize)
.reduce(0, (left, right) -> Math.max(left, right));
System.out.println("16歳以上、26歳未満で一番大きな胸のサイズは" + maxBust + "です。");
}
private static class Lady {
int bustSize;
int age;
public Lady(int bustSize, int age) {
this.bustSize = bustSize;
this.age = age;
}
}
}
なんか見慣れないものがちらほらありますね。
実行結果は
Good! (^^)
この部分が JDK 8 の新兵器 Lambda ですね。
int maxBust = ladies.filter(l -> l.age > 15 && l.age < 26)
.map(l -> l.bustSize)
.reduce(0, (left, right) -> Math.max(left, right));
見慣れないメソッドの正体は
filter メソッド : コレクションの要素のフィルタリングをする優れものです。
引数の Predicate オブジェクトの eval メソッドの戻り値が true の要素だけをフィルタリングします。
map メソッド : 新しいコレクションを作り直すメソッドです。
Mapper オブジェクトの map メソッドの戻り値を新たな要素としたコレクションを作ります。
reduce メソッド : 要素を減らして、最終的に一つにするためのメソッドです。
以上のように Lambda を使うポイントを少しだけ知ったつもりになった。(^0^;)
もっと詳しく知りたい方は参考にさせていただいたというよりは、まるっといただいたサイトを紹介します。
こちらのサイトが勉強になります。
ただし、上記のプログラムでパラレル処理をする方法も載っていましたが
なんと エラー になってしまいます。
Lambda はまだ開発途中なので紹介したサイトの情報もいつまで有効なのかは解りません。
日本語の情報はまだまだ少ないようなので、英語が得意な方は英語サイトをググって情報収集したほうがいいかもです。