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に似ているけど再帰で書く問題で、時間がないからすぐに解答が公開されたのですが、これを見たときの気持ちが、こんなかんじ。
Lambda使うと、もう完全に別言語にしか見えない。「パパー、敷居たかいたかーいしてー!」「合計値の計算をするなら、Lambda式で再帰を書くと早い」「きゃっきゃっ」 #jjug
— 谷本 心さん (@cero_t) 7月 25, 2012
雑感
この方と同じこと考えました。
Lambdaのハンズオンを終えて至った結論が、Scalaやってみよう!な件。
— Munenori Hirakawaさん (@hiranasu) 7月 25, 2012
私はまだScalaもやってないのだけれど、ドキュメントとしてはそろってるので、まずはScala、あるいは別の関数型言語を学習後、Project Lambdaに再チャレンジですね。InfoQに比較記事があったので、こちらも確認。
うちのマシンだとProject Lambdaは処理が遅いです。