関ジャバに参加してきました: 【Date and Time API】Java 8徹底再入門【ラムダ式ハンズオン】(大阪,7/11)
日付変わりまして、昨日(2015/7/11(土))、久しぶりに関ジャバに参加してきました!
勉強会についてのブログは、初めて書きましたが、もし不適切な表現などございましたら、直しますので、@ttshiko まで優しくご指摘いただけると嬉しいです。
【Date and Time API】Java 8徹底再入門【ラムダ式ハンズオン】(大阪,7/11)
http://kanjava.connpass.com/event/15515/
(主催: 関西 Java エンジニアの会)
ここ最近、業務が忙しいことを言い訳に腰が重くなっていましたが、
結論から言うと、楽しかった!わかりやすかった!感動した!参加した甲斐があった!ほんまによかった!
非常に充実した時間を過ごすことができました。
運営スタッフの皆様、楽天様、登壇者の皆様、自分以外の参加者の皆様、すべてにありがとうございます!
以下、簡単ですが、気に入った内容(まとまった資料は公開されるように思いますので)などを。
前半:JSR 310 "Date and Time API" への招待 III(@btnrougeさん)
登壇者のはすぬまさんの発表には、今回初めて参加することができたのですが、
落ち着いてわかりやすく話してくださり、とても拝聴しやすかったです。
既に、ご自身で早速ブログを更新されていらっしゃいましたので、詳しくはそちらをどうぞ
http://www.coppermine.jp/docs/programming/2015/07/jsr310-kanjava.html
- 当日、個人的に気に入った内容(諸事情により途中からの参加でしたが、前半は ISO8601 についての解説があった模様です)
- isBefore, isAfter は、等しい日時の場合、falseを返す
- ResolverStyle という enum が追加されている。LENIENT, SMART(default), STRICT。Java7までも似たような概念があったが(編注:java.util.Calendar#setLenient(boolean)のことかな?)、STRICTがちゃんと実装されたようで、取扱い注意。
- 人間時間の Period, Duration は、ISO8601的には、どちらも "period" で、それぞれ、その「日付」部分と「時間」部分。
- Clock という"時間軸"を表す概念がある。Fixed Clock(刻を止めた時計)はテストに役立つ。
- おすすめの勉強法
- ISO8601について学ぶ(JIS X 0301 が事実上の日本語訳)
- LocalDateの使い方についてマスターする
- Local/Offset/Zoned の存在の理由を把握する。ヒント:「普段、『日本時間』の○○時という言い方をするでしょうか?(反語調)」
- クラス群(全部で69個)に学習のプライオリティ(優先度)を置く。よく使うもの(せいぜい20個ほど)を徹底的に。
- トライ&エラー。Java Day Tokyo にて、アンジェラさんがよい例をたくさん挙げていた。(編注:この資料のことかな? http://www.oracle.co.jp/jdt2015/pdf/1-2.pdf)
質問タイムには勇気がなくて手を挙げられなかったのですが、Date and Time と言えば、「0時表記」と「24時表記」の相互変換に苦労した思い出があるので
勉強会後に、初対面ながら、その取り扱いについて直接ご質問させていただいたところ、「内部的には、23:59:59 までの取り扱いで、24:00:00は、翌日の00:00:00と見なしています」と優しく教えてくださり、感謝すると同時に、今度は勉強会の場で、勇気を出して、質問してみよう!と感じた次第です。
ちなみに、「0時表記⇔24時表記」に苦労した当時は、javax.swing.JSpinner.DateEditor (Java6) (Java8版はこちらですが、JavaFXだとどうやるんだろう?)等もハックしていましたなぁ。
後半:きつねさんと学ぶLambda式&StreamAPIハンズオン(@bitter_foxさん)
ハンズオンという形式自体に初めての参加で、こちらも楽しみにしていました。登壇者のきつねさんといえば「Javaエンジニア養成読本」などでもお世話になっています。
ハンズオン用の資料は NetBeansでご準備されたようでしたが、他のIDEでも動作するとのことでしたので、自分は人柱覚悟で、先月(2015年6月)リリースされたばかりの Eclipse 4.5(Mars) (いやあの、業務がEclipseなもので)で敢えて挑みましたが、何も問題が起こることなく、
案内される手順にしたがうだけで、あれよあれよと言う間に、ラムダ式やStreamが書けてしまうところは、本当に感動ものでした。
- 当日、個人的に気に入った内容
- 匿名クラスをラムダ式へ変換する作法
- 引数と処理だけ残す
- 引数と処理を -> でつなぐ
- 匿名クラスをラムダ式へ変換する作法
-
-
- 処理が一文の場合は、{} も省略できる
- 処理の末尾の ; は省略できる(文末の ; は必要)
- 処理に戻り値がある場合、キーワード "return" も省略できる
- 引数の型を省略できる
- 引数が1個の場合は、引数を囲む()も省略できる
- 処理が一文の場合は、{} も省略できる
- 「関数型インタフェースであること」の条件を満たしていれば、@FunctionalInterface アノテーションを付けていなくても(たとえば、Java8リリース以前のような古いコードの場合でも)、ラムダ式を使うことができる。新しいコードには、防御的に @FunctionalInterface を付ける。
- StreamAPIのような内部イテレーションは並列化が容易。
- StreamAPI利用の基本は、「ソース→中間操作→・・・→中間操作→終端操作」
- Iterable#forEach で、「副作用
(例:画面に出力する、など)(例:外の環境にあるListに値を追加する、など)」を持たせない。
- Iterable#forEach で、「副作用
- 中間操作は終端操作が行われる時に評価される(遅延評価)ので、外部イテレーションと同等(並列ではなく、逐次処理として比較)のパフォーマンスを確保。
- IntStream には、rangeメソッドとrangeClosed メソッドがある。違いは、範囲の終端を含むかどうか(前者は含まない。後者は含む。)(編注:closed という用語は、「閉集合」あたりと出所は一緒なのだろうなぁ)
- Random#doubles で、DoubleStream を取得できるが、"無限"ストリームとなるので、取扱い注意。limitを併用する。
- 並列化したらマルチコアなら速くなる可能性が高い。並列化しても速くならない場合もある。
- flatMapメソッドの意義。map を使ってしまうと、Stream
> になってしまうところを、flatMap で Stream に"平坦化"する。(flatMap の引数は、Streamを返すようなラムダ式)(編注:flatって便利な単語だなぁ。時空が曲がっていないこともflatって言ったり。) - 終端操作の collect(Collector) は強力。
- Collectors#toXXX - toList, toSet
- Collectors#joining(delimiter, prefix, suffix) で、集約処理として、文字列の連結(区切り文字(delimiter), 接頭辞(prefix), 接尾辞(suffix)指定可能)ができる
- Collectors#groupingBy
- groupingBy(T -> K); Kの同じ値でグループ化(Mapを作る)
- groupingby(T -> K, Collector); 第二引数はMapの値へのCollector
- groupingBy v.s. groupingByConcurrent。
- Collectors の static メソッドは多用するので、import static がおすすめ。(そうしないとすごいことになる)
-
今回はサブの話題でしたが、並列化への興味は強いので、その観点も深めてみたいと感じましたヨ。
懇親会♪
会場までの道すがら、登壇者の@khasunumaさんとお話しできたり、会場でも、同席の皆様から色々なありがたいお話を伺えたり(@s_kozake さん、 @irof さん、ほか皆様ありがとうございました。お名前をお伺いできなかった方ごめんなさいm(_ _)m。もしよかったら @ttshiko までお知らせください。)、文字通り、勉強会の興奮冷めやらぬという雰囲気で、楽しく過ごすことができました。
ただ一つ、てらだよしおさんの退職を、遅ればせながら、このとき初めて知ることになり、ショックでしたが(´・ω・`)、
てらだよしおさんには、今までありがとうございます!とともに、これからも新天地でのご活躍お祈りしておりますm(_ _)m
さて、関ジャバの方ですが、Java8 はなかなかまとまって触れる機会を持てていなかったのですが、あらためて、頑張って、いや違う、楽しんで、身につけようという意識が高まった一日で、ほんまに参加してよかったと心から感じました。
皆様、あらためてありがとうございましたm(_ _)m
今後とも宜しくお願いいたしますm(_ _)m
2015/7/15(水)追記:てらだよしおさんのことですが 2015/7/11(土)付で、Microsoft社に入社されたそうです。一時は大変驚きましたが「Microsoft Love OSS」を掲げて、活躍されるとのこと。
詳しくはご本人様のブログ(マイクロソフトのエバンジェリストとして活動開始)に記載されております。てらだよしおさん、おめでとうございます!
なんだか未来が楽しみです(^O^)
@ttshiko ブログありがとうございます!楽しんでいただけたようで良かったです.「Iterable#forEach で、「副作用(例:画面に出力する、など)」を持たせない。」ですが,例の画面に出力するというのはforEachで書くので良くないかもしれないです.
— bitter_fox@フッカーツ (@bitter_fox) 2015, 7月 12
@ttshiko この場合ではコードレベルの副作用を書かないようにするというので十分で,「外の環境にあるListに値を追加する」といった様な例が良いかと思います.
— bitter_fox@フッカーツ (@bitter_fox) 2015, 7月 12
@bitter_fox ご指摘有難うございます(^o^)!なるほど、そういうことなのですね、更に理解が深まります!早速、修正させていただきました。文言も絶妙と思いまして、そのまま使わせていただいております。有難うございます!また何かあれば宜しくお願いいたします #kanjava
— T.S. (@ttshiko) 2015, 7月 12
そっか、頑張るんじゃなくて、楽しんで、か。なんだかしばらく忘れていた感覚を思い出させてくれていたんだ。勉強会にはこんな効果もあるのか。楽しめるってのは、有難いことだなぁ。
改めて皆様に感謝です(^人^)m(_ _)m
#kanjava
http://t.co/vNc3WH5Cut
— T.S. (@ttshiko) 2015, 7月 12