JJUG Night Seminar で Project Lambda ハンズオン してきた

 参加したけど、事前にひとつくらい関数型勉強しとくべきでした。

7月25日 JJUG Night Seminar ~ Project Lambda ハンズオン ~(東京都)
JJUG Java 8 Lambda ハンズオン #jjug - Togetter

セミナー資料

事前準備

 櫻庭さんのブログで書かれてる通り、この勉強会の時点で公開されているJDK8にはProject Lambdaは入っておらず、特別にパッケージングされたのが公開されていたので、それを利用。ダウンロードしてパス通すだけなので特に問題なく。

Java in the Box Annex: JJUG Project Lambda Hands-on 事前準備


Project Lambda

 関数型で言われるλ式JavaでいうLambda式は異なるものらしい。以前実装しようとされていたが凍結されたClojureは、Oracleに吸収されたときにProject Lambdaとして復活しました。しかし、これの目的は並列処理をさせてマルチコアを遊ばせないためのものです。JavaのLambda式はこれを簡単に記述する方法。具体的には、実装すべきメソッドが1つだけのインタフェース(関数型インタフェース)を実装する無名クラスの簡易記述。


ハンズオン

 講座30分+ハンズオン90分の予定が、講座が80分くらいかかり、ハンズオンが40分くらいになったので、かなり押し気味に。
 課題は、今までの記述によるコードを、Lambda式で書き直すというもので5つ。コードは上記資料にも書いていますが、githubから取得するのが早いでしょう。

JJUG Project Lambda Hands-on Materials · GitHub

課題1: SwingDemo

ActionListener listener = new ActionListener() {
 public void actionPerformed(ActionEvent event) {
  label.setText(field.getText());
 }
};

を次のように書き換える。

ActionListener listener
 = event -> { label.setText(field.getText()); };

課題2: FizzBuzz

for (Integer num: numbers) {
 // 省略
}

を次のように書き換える。

numbers.forEach( num -> {
 // 省略
});

課題3: ScoreFinderのコンストラク
以下を記述する。

List students = initStudents();

Integer maxScore = students.filter( s -> s.getGradYear() == 2011 )
  .map(Student::getScore)
  .reduce(0, (s1, s2) -> (s1>s2) ? s1: s2);

System.out.println(maxScore);


 私はここで断念。課題4は課題3に似ているけど再帰で書く問題で、時間がないからすぐに解答が公開されたのですが、これを見たときの気持ちが、こんなかんじ。


雑感

 この方と同じこと考えました。

 私はまだScalaもやってないのだけれど、ドキュメントとしてはそろってるので、まずはScala、あるいは別の関数型言語を学習後、Project Lambdaに再チャレンジですね。InfoQに比較記事があったので、こちらも確認。

Java 8 vs Scala: 特徴を比較する

 うちのマシンだとProject Lambdaは処理が遅いです。