「祝☆Java 8 Launch」に行ってきた #JJUG

3/18にリリースされたJava SE 8を勉強するためにJJUGの勉強会に参加してきました。

何回かOracleに来てますが、2部屋ぶちぬきでしかもテーブルなしというのははじめてでした。
っと思ったら、MAX300人はOracle初だったらしいです。

最初にまとめ

メモが長くなってしまったので、最初にまとめ。

  • Lambdaは凄い。
    • 簡潔に書ける(場合もある
    • 最初は読みにくいかもだけど、慣れる
    • forやwhileをみたらStream APIへの置換えを考える。
  • 既存のAPI、処理もパフォーマンス向上!
  • メモリの使用量も低下。
  • JavaFX8もパフォーマンス向上!

Java SE 8 正式リリース

13:00〜13:30 祝 Java SE 8 正式リリース

寺田 佳央(@yoshioterada) 日本オラクル Java エバンジェリスト

2011 年 7 月に Java SE 7 がリリースされ、ついにJava SE 8 が正式にリリースされました。Java SE 8 では目玉機能である Project Lambda の他、JavaFX の統合、新規 JavaScript エンジンの提供など、50 を超える機能が追加もしくは改善されています。
本セッションは Java SE 8 の概要をわかりやすくご紹介します。
  • テクニカルの話はない。
  • 今日の話で出てこない話をする。
  • 135枚のスライドは全部紹介できないので、blogに書くのでそっちを見てくれ。
  • JavaSE 7を出す時に全部ひっくるめて出すか、段階的にリリースしていくか。
  • 段階的にリリースしていくことに決定。
  • SE7 2011年7月28日リリース
  • 会場にいる方の現在使用Javaバージョンの調査。
    • 7が圧倒的。
    • 1.4の人も何人か。
  • 2012年7月17日
    • JigsawはJavaSE9へ持ち越し。
  • 2013の年始から中旬までOracleのトップ判断で、セキュリティ脆弱性対応に集中。
  • スケジュールをずらしても構わないとの事。
  • 2014年4月26日
    • 2014/03/18にリリース決定。
  • JSR-337 : Java SE8
  • JavaSE8にすることのメリットは多くある。
  • クラスファイルのフォーマットなども変わってる。
  • パフォーマンスを上げるための機能、既存のライブラリにも修正が。
  • メモリの使用量も減っているらしい。
  • 新機能を使用しなくても、メリットはたくさんある。
  • Compactプロファイル。(ファイルサイズが異る。)
  • APIにどのプロファイルで利用可能か記載されている。
  • 参考資料
    • JavaSE8のリリースノート
      • 機能以外のJDK8のサポートする環境も乗っていたりする
    • JDKの新機能概要
    • Java Platform Standard Edition8ドキュメント
    • JDK8の互換性・非互換性の情報ガイド(コンパチビリティーガイド?
    • Java7 からJava8 に変わって、何が変わったのか。
    • Java7 ではワーニングだったものがコンパイルが通るようになったりしているらしい。
    • デフォ値がfalseだったのがtrueになったとかもあるらしい。(過去のSwingの話
  • Java7のサポートも来年4月に変わっている。
今後のJava関連イベント

5月のJava祭り

まとめ

新機能だけじゃなくて、色々加わってる。
楽になってるし、早くもなっている。

徹底解説!Project Lambdaのすべて リターンズ

13:30〜14:20 徹底解説!Project Lambdaのすべて リターンズ

発表者:吉田 真也(@bitter_fox) 立命館大学 立命館コンピュータクラブ

Java 8 における最大級のプロジェクトであるProject Lambda で導入された言語特徴のすべてを解説します。また、Project Lambda で導入されたStream API も解説します。
なぜその特徴を導入しなければいけないかや他の特徴とどのように関連しているのかについても説明しますので、より広い視野でProject Lambda を理解することができます。
Project Lambda のそれぞれの特徴と全体像を理解できるセッションです。
  • Lambdaの開発者にツッコミを入れたりしてるらしい。
  • 大学生。立命館大学
  • アップデートには2種類ある
    • エボリューション
    • レボリューション
    • 日本語的には進化と革命
  • Jdk5以来、レボリューションは10年ぶり2004年ぶり。
  • ラムダは、並列処理を容易に書けるように増強。
    • ライブラリ、言語
    • マルチコアCPU
    • クロック数はそのまま、コア数を増やす。並列処理。
    • 並列プログラミングをしないと、性能を活かすことが出来ない。
  • 並列処理
  • Java5で大きな粒度 簡単
    • Java7で小さな粒度 やや難
  • 処理を分けるだけで5行(匿名クラスを使用)
    • 言語的に解決する必要がある。
  • ライブラリの増強
  • 全体像、ラムダの全体で7個。
ラムダ式・メソッド参照
実質的にfinal
  • 匿名クラスはfinalの変数しかアクセスできなかった。
  • コンパイラが変数が変更されるか判断するので、final修飾子がなくてもアクセス可能。
  • よって、ラムダ式内で値を変更したり、ラムダの後で値を変更したりするとコンパイルエラー
型推論の強化
  • ターゲット型推論の強化
  • ターゲット型に基づく型推論
  • 有ある式の方として予期される型のこと
交差型キャスト
  • キャスト式に交差型を。
  • T extends
  • 型合成される
  • ぶっちゃけ使わないwww
    • APIでも使用してるクラスは5個
デフォルト実装
staticインターフェイスメソッド

コアライブラリ
  • StreamAPI
  • Optional
  • JCF
  • IO
  • And more
  • StreamAPI
  • イテレーションが外に晒されている
    • for,while文
  • StremAPI
    • 並列化が簡単に行える。
  • java.util.stream
    • ソースから生成される。
    • 中間操作と終端操作でデータを弄る。
    • 並列化が容易
IntStream.rangeClose(0,10).forEach(i -> System.out.println(i));
// 偶数のみ表示
IntStream.rangeClose(0,10).filter(i->i%2==0).forEach(...)
// Personのリストから名前を出力
// map
persons.stream().map(p-> p.getName()).forEach(....)
// Personのリストから名前のリスト
persons.stream().map(Person::getName).collect(p-> )
まとめ
  • 元々はマルチコア対応
  • 結果としては汎用的な仕様に
  • よりスマートなコードへ

null書いたら負け!Java8コーディング作法

14:30〜15:20 null書いたら負け!Java8コーディング作法

発表者:きしだ なおき(@kis)

負けだよ。
  • null書いたら負け!
  • Streamはコーディング規約で禁止でもいい
  • Date and Timeはよくわからない

だが、nullお前だけはダメ。

  • java.util.Optional
  • 値を持つか持たないかを判別。
  • nullのある世界とない世界の分離
  • nullを使っていいところ悪いところ
  • 良い
    • ローカル変数
  • 微妙
    • 引数
  • 悪い
    • フィールド
    • 戻り値
  • nullを外に漏らさなければOK
覚えて欲しいのは

nullを返すメソッドを書いたら負け。

Java8の他の作法
  • Streamでの注意
  • メソッド参照とラムダの使い分け
  • 遅延実行を活かす
  • Mapを活用する
  • 制御構造を自作する
  • Streamでの注意
    • 副作用に気をつける
    • メソッドの中でメソッドの外に影響を与えない
  • 副作用を使う基準
    • 中間操作×
    • 終端操作
      • reduce △
      • forEach ○
  • 遅延実行を活かす
    • 値が使われる可能性の低い引数の構築に時間がかかる時
logger.debug(bigObject.toString());
logger.fine(()->bigObject.toString());
    • Optional
      • Optional#orElseGet
      • Optional#orElseThrow
      • 使う可能性が低い時はラムダにしとけば、使うときにのみ実行してくれる?
  • Mapを活用する
    • Map>
  • 追加
    • Map#computelfAbsent
    • Mapが空だった時にその値を突っ込んで返してくれる?
  • 削除
    • Map#computerlfPresent
  • メモ化
    • Map#computelfAbsent
    • 値があればその値、なければ計算を行って結果をMapに格納しつつ返す。
  • 制御構造を自作する
    • カスタムwith
    • カスタム分岐
    • カスタムマッチ
    • カスタムループ
  • メソッド参照とラムダの使い分け
    • メソッド参照は引数を隠す。
    • 読み解くにはコンテキスト理解が必要。
  • メソッドに渡すためのメソッド○
  • 引数一つのメソッド△
  • 引数複数のメソッド×

Brand new Date and Time API

15:30〜16:20 Brand new Date and Time API

発表者:蓮沼 賢志(@khasunuma) JSR 310 オブザーバー

Java Community Process (JCP) では、2007 年から Java の日付と時刻の扱いを改善する JSR 310 “Date and Time API” を開始し、7 年の歳月を経て Java SE 8 の標準 API として結実しました。これまでの Date や Calendar とは全く異なる思想で開発された最新の日付・時刻 API を今日から活用して頂けるよう、このセッションがお手伝いを致します。
  • 日付と時刻のAPI
  • ISO8601
  • UNIXタイムと異なる概念
  • 日付とは何。
  • 日付とは秒が基準。
  • java.time, java.time.format, java.time.chronoパッケージでだいたいおk
  • isBefore
  • isEqualsとかもある。

JavaFXGUI by Illusion

16:30〜17:20 JavaFX – GUI by Illusion

発表者:櫻庭 祐一(@skrb) Java in the Box

Java SE 8 では、Swing に代わり JavaFX が標準の GUI ライブラリとなります。
JavaFX は、XML で GUI の構造を記述し、CSS で見た目を、Java でロジックを記述するようになります。また、組み込みブラウザやチャートなど多くの機能が提供されています。
本セッションでは、JavaFX の基本から、Swing からのマイグレーション、JavaFX 8の新機能などを、デモを交えて紹介します。
  • 今までJavaに無かったエフェクトを入れるよということでJavaFX
    • "%jre%\lib\calendars.properties"に和暦とかを追加することができる。
  • JavaFXって何
  • Swingからの移行
  • JavaFX 8の新機能
  • JavaFXって何
    • JavaSEの新しいGUIライブラリ
    • Swing + java2D + JavaMediaFW + α
    • FXMLとCSSJavaで書く。
    • FXML - ControllerClass - Model
  • SceanBuilder
  • EclipseはeFXclipseで連携できるらしい。
  • Browser
  • 3行
WebView view=new WebView();
WebEngine engine = view.getEngine();
engine.load("http://www.google.com");
  • Media
    • 標準的な形式は大体動く
  • Effect
    • 一通りできる
  • Animation
    • 当たり前のように動く
  • Touch Gesture
    • 1行で回転!1行でズーム!
  • robovmっというの使えばIOSで動作するように変換できるらしい。
  • Swingからの移行
    • 構造は殆ど同じ、
    • ただ、FXMLでかけるよ!
    • 各クラスに関してもJを除いたり、似た名前であります。
    • 属性とかも殆どそのまま使える。
    • TableやTreeに関しては考え方が変わってるので鬼門になるかも。
  • JavaFX8
    • 色々変わってる
    • パフォーマンスが格段にアップ!
    • 3D
    • 印刷が使えるように(今まで何故なかったw
    • テーマ(CSSでアプリケーション全体の見た目を変えることができる。
    • DatePicker(LocalDateが取れる。
    • JavaFXの中でSwingやSWTを動かす事ができるようになった。
    • 非同期処理を簡単に書けるようになった
    • ショートカットキーでフルスクリーンにする事ができるようになった
    • とかとか。。。
  • 3Dを簡単に説明
  • FXは新しいGUIライブラリなんだよ
  • FXML-CSS-Javaで書ける
  • いろいろ新しいのが入ったよ。
  • Swingから簡単に移行できるよ。
  • JavaFX8は色々すごいよ!
  • OpenJDKでも動く。

from old Java to modern Java – reloaded

17:30〜18:20 from old Java to modern Java – reloaded

発表者:谷本 心(@cero_t) Acroquest Technology

Java SE 8がリリースされるというニュースを目にしても「どうせ仕事では使えないし」と冷ややかに見ていませんか?
確かに開発の現場では、様々な制約のために古いバージョンのJavaを使わざるを得ないことがあります。しかしだからと言って学ばないままでいると、いざ新しいバージョンのJavaを使おうという時に、ついつい古いAPIを使ってしまったり、古い慣習に従って書いてしまうことになるでしょう。
このセッションでは、JavaのAPIや慣習について、古い時代のものからJava8までの歴史を振り返りながら、イマドキの書き方を紹介します。
  • 仕事でJava8を使おうと思った時に何を気をつければいいのか。
  • 老害にならないためのJava8入門。
    • ラムダで欠かれたコードをレビューした時に読みにくいと言わないように勉強しなければならない。
  • finallyでCloseするのは古い定石(〜Java6
  • tryの中で開く。(〜Java7
  • FilesとかPathクラスとか使わないとダメだよね。
  • try-with-resourcesとFilesとPathで操作する。(Java7〜
Files.lines(Paths.get(fileName)).forEach(s-> lines.add("<" + s + ">"));
  • forやwhileをみたらStream APIへの置換えを考える。
  • ラムダでmapとcollectはよく使う。(Streamはここから始める)
  • 何でもかんでもLambdaにすればいいわけじゃない。
  • 「ラムダ禁止」でググる
    • ラムダのAPIをもっと便利に使うことができる。
まとめ

自分たちの標準としてどうすれば読みやすくするかチームで考えよう!
Java本格入門(仮)鋭意執筆中!

Raspberry Pi on Java ショートアップデート

18:20〜18:30 Raspberry Pi on Java ショートアップデート

発表者:太田 昌文(@masafumiohta) Japanese Raspberry Pi Users Group

昨年度のリリースからRaspberry PiにOracle Javaが標準パッケージとしてインストールされるようになりました!Raspberry Pi Foundation FounderであるEben UptonもPythonの他JavaもRaspberry Piで使えるプログラミング言語として注目をしております。ここではごく簡単にRaspberry Piのご紹介とJava Embedded on Raspberry Piのアップデートについてお話しいたします。