ttshikoのブログ

プログラマをしています。普段、様々な情報(特にICT関連の技術情報)にお世話になっているので、その恩返しをできるようになりたいと考えて始めました。

関ジャバに参加してきました: 【Date and Time API】Java 8徹底再入門【ラムダ式ハンズオン】(大阪,7/11)

日付変わりまして、昨日(2015/7/11(土))、久しぶりに関ジャバに参加してきました!
勉強会についてのブログは、初めて書きましたが、もし不適切な表現などございましたら、直しますので、@ttshiko まで優しくご指摘いただけると嬉しいです。

【Date and Time APIJava 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が書けてしまうところは、本当に感動ものでした。

  • 当日、個人的に気に入った内容
    • 匿名クラスをラムダ式へ変換する作法
      1. 引数と処理だけ残す
      2. 引数と処理を -> でつなぐ
      1. 処理が一文の場合は、{} も省略できる
        1. 処理の末尾の ; は省略できる(文末の ; は必要)
        2. 処理に戻り値がある場合、キーワード "return" も省略できる
      2. 引数の型を省略できる
      3. 引数が1個の場合は、引数を囲む()も省略できる
    • 「関数型インタフェースであること」の条件を満たしていれば、@FunctionalInterface アノテーションを付けていなくても(たとえば、Java8リリース以前のような古いコードの場合でも)、ラムダ式を使うことができる。新しいコードには、防御的に @FunctionalInterface を付ける。
    • StreamAPIのような内部イテレーションは並列化が容易。
    • StreamAPI利用の基本は、「ソース→中間操作→・・・→中間操作→終端操作」
      • Iterable#forEach で、「副作用(例:画面に出力する、など)(例:外の環境にあるListに値を追加する、など)」を持たせない。
    • 中間操作は終端操作が行われる時に評価される(遅延評価)ので、外部イテレーションと同等(並列ではなく、逐次処理として比較)のパフォーマンスを確保。
    • 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。
          • groupingBy でも並列化できるが逐次より遅くなる可能性がある。中間操作がある場合は、groupingByConcurrent の方が、逐次よりも高速になる場合がある。どちらがよいかは場合による。
          • groupingBy は分割統治法(都度Mapを作り合成していく)。groupingByConcurrent は、単一のMapに 並列に(concurrent) アクセスする。
      • 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^)