Java SE 8 New Features

4,263 views

Published on

Java SE 8 explanation

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,263
On SlideShare
0
From Embeds
0
Number of Embeds
57
Actions
Shares
0
Downloads
15
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Java SE 8 New Features

  1. 1. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.1 祝 Java SE 8 正式リリース Yoshio Terada Java Evangelist http://yoshio3.com Twitter : @yoshioterada
  2. 2. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.2 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。 また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことは できません。以下の事項は、マテリアルやコード、機能を提供することをコミットメン ト(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さ い。オラクル製品に関して記載されている機能の開発、リリースおよび時期につい ては、弊社の裁量により決定されます。 Oracleは、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標です。 文中の社名、商品名等は各社の商標または登録商標である場合があります。
  3. 3. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.3 Java SE 6 Java SE 7 Java SE 8 Java SE 9 2006年12月 2011年07月 2014年03月 2016年 Java リリースの歴史
  4. 4. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.4 Java SE 6 2006年12月 Java SE 6 の新機能 2006 年 12 月 11 日 Java SE 5 を改良したバージョン ● Web サービス ● JavaScript エンジン Rhino を組み込み ● AWT/Swing ライブラリの改善 ● Java DB の統合 ● JDBC の改善 など
  5. 5. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.5 Java SE 7 2011年07月 Java SE 7 がリリースされるまで 2010 年 9 月 8 日 タイトル:Re-thinking JDK 7 Plan A: JDK 7 (as currently defined) Mid 2012 Plan B: JDK 7 : Mid 2011 (minus Lambda, Jigsaw, and part of Coin) JDK 8 : Late 2012 (Lambda, Jigsaw, the rest of Coin, ++) Plan B:早く実装が可能な一部機能を先にリリース
  6. 6. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.6 Java SE 7 2011年07月 Java SE 7 の新機能 開発生産性向上と Java SE 8 の準備 ● Project Coin ● Java NIO.2 ● Fork/Join Framework ● InvokeDynamic バイトコード命令
  7. 7. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.7 Java SE 8 2014年03月 Java SE 8 リリースまでの道のり1 2012 年 7 月 17 日 タイトル:Project Jigsaw: Late for the train I think the best choice is to defer Project Jigsaw to Java 9, and to aim for a two-year release cycle going forward. On this plan Java 8 will ship on time, around September 2013. Jigsaw の検討、実装、検証に時間が足りないため 次の Java SE 9 へ持ち越し Java SE 8 2013年9月
  8. 8. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.8 Java SE 8 リリースまでの道のり2 2013 年 4 月 18 日 タイトル:Java 8: Secure the train As a consequence of this renewed focus on security the Java 8 schedule, with a GA release in early September, is no longer achievable. then resume a regular two-year release cadence, with Java 8 due in early 2014 and Java 9 in early 2016. Java開発者がセキュリティ脆弱性対応に集中し、 リリース日を2013 年 9 月から2014年初旬に変更 Java SE 8 2014年初旬
  9. 9. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.9 Java SE 8 リリースまでの道のり3 2013 年 4 月 26 日 タイトル:Java 8: Hold the train The target release date for Java 8 is now 2014/3/18. Java SE 8 2014年03月 最終的なリリース予定日を 3/18 に決定
  10. 10. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.10 祝 Java SE 8 正式リリース 2014 年 03 月 18 日
  11. 11. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.11 JSR- 337 : Java SE 8
  12. 12. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.12 Java SE 7 と Java SE 8 の関係 Java SE 7 の主要な新機能 Project Coin Java NIO.2 Fork/Join Framework InvokeDynamic Java SE 8 の主要な新機能 Lambda 式 Stream API Nashorn (JavaScript) 利用と 改善 Date & Time API Type Annotation Compact Profile JavaFX の統合 Java VM の統合
  13. 13. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.13 Project Lambda Lambda 式 Streaming API
  14. 14. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.14 マルチコア時代
  15. 15. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.15 Java SE 7 で導入 Fork/Join フレームワークの概念 (粒度小)  大きな問題を細かい問題に分割し、分割した問題を個別に解決 した後、最後に結果を集計 大きな問題 細かい 問題 細かい 問題 細かい 問題 個別 処理 個別 処理 個別 処理 結合結果
  16. 16. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.16 ここで登場 Lambda
  17. 17. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.17 Lambda 式とは 後から実行するコード・ブロックの 実装を簡潔に記述するための手法 (匿名インナー・クラスの簡易記法+α)
  18. 18. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.18 Functional(関数型)インタフェース @FunctionalInterface public interface Runnable { public abstract void run(); } 実装すべきメソッドが一つのインタフェース Lambda 式(メソッド参照)のターゲット型
  19. 19. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.19 Functional(関数型)インタフェース java.lang.Runnable java.nio.file.PathMatcher java.util.Comparator java.util.concurrent.Callable java.util.logging.Filter
  20. 20. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.20 java.util.function パッケージ http://docs.oracle.com/javase/jp/8/api/java/lang/class-use/FunctionalInterface.html Java SE 8 より追加:43 個の関数型インタフェースを含む インタフェース名 引数 返り値 説明 Predicate<T> T boolean 1つの引数を受け取り boolean を返す Consumer<T> T void 1つの引数を受け取り結果を返さない Function<T,R> T R 1つの引数を受け取り結果を生成する Supplier<T> 無し T 完了結果の取得 UnaryOperation<T> T T 単項演算(引数と返り値が同じ) BinaryOperation<T> (T, T) T 2項演算(引数を2つ取り返り値が同 じ)
  21. 21. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.21 これは、関数型インタフェース? @FunctionalInterface public interface SomeFunctionalInterface { public boolean equals(Object object); }
  22. 22. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.22 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.22 ExecutorService service = ...; service.submit(new Runnable() { @Override public void run() { // 非同期に処理するタスク doSomething(); } }); 1. 匿名インナー・クラスとして実装
  23. 23. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.23 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.23 ExecutorService service = ...; service.submit(new Runnable() { @Override public void run() { // 非同期に処理するタスク doSomething(); } }); -> 2. インナー・クラス名、メソッド名を削除 メソッドの引数とメソッド・ボディの間に ->
  24. 24. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.24 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.24 ExecutorService service = ...; service.submit(() -> doSomething()); 単一の abstract メドッドを持つ 関数型インタフェースを書き換え可能 Java SE 8 ラムダ式
  25. 25. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.25 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.25 このコードはどこが問題? (JavaSE7) int a = 0; Runnable run = new Runnable() { @Override public void run() { System.out.println(a); } }; ExecutorService exec = Executors.newSingleThreadExecutor(); exec.submit(run); エラー: ローカル変数 a は内部クラスからアクセ スされます。finalで宣言される必要があります final int a = 0;
  26. 26. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.26 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.26 Java SE 8 は実質的に final ならば可 int a = 0; Runnable run = new Runnable() { @Override public void run() { System.out.println(a); } }; ExecutorService exec = Executors.newSingleThreadExecutor(); exec.submit(run); 更新されない値(実質的にfinal)の参照ならば コンパイル・エラーにはなりません。
  27. 27. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.27 Stream API
  28. 28. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.28 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.28 拡張 for 文による操作(JavaSE7) List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); for (String data : list) { if (data.startsWith("a")) { System.out.println(data); } } 先頭が a で始まる文字列を出力
  29. 29. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.29 Stream API とは コレクションに対する バルク(一括)処理が可能 Lambda 式を使用し可読性向上
  30. 30. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.30 Stream API による実装 (パイプライン処理) 終端操作が呼び出されるまで処理は未実行 Stream の生成 Stream.of() Stream.empty() Stream.generate() list.stream() 中間操作 filter map mapToInt flatMap distinct sorted limit skip など 終端操作 forEach forEachOrdered toArray reduce collect min,max,count など
  31. 31. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.31 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.31 Stream の生成 Stream stream = Stream.of("aaa", "bbb", "ccc” , ”abc”); List<String> list = Arrays.asList("aaa", "bbb", "ccc", “abc”); Stream listStream = list.stream();
  32. 32. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.32 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.32 Stream API による操作(JavaSE8) List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(Predicate<? super T> predicate) .forEach(Consumer<? super T> action); if 文を filter で置き換え for 文を forEach で置き換え
  33. 33. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.33 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.33 Predicate/Consumer インタフェース @FunctionalInterface public interface Predicate<T> { boolean test(T t) } @FunctionalInterface public interface Consumer<T>{ void accept(T t); }
  34. 34. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.34 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.34 Stream によるコレクション操作 匿名インナー・クラスで実装 List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(new Predicate<String>() { public boolean test(String data) { return data.startsWith("a"); }}) .forEach(new Consumer<String>() { public void accept(String data) { System.out.println(data); }});
  35. 35. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.35 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.35 Lambda 式に変換 メソッドの引数とボディを残し間に矢印 -> を挿入 List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(new Predicate<String>() { public boolean test(String data) { return data.startsWith("a"); }}) .forEach(new Consumer<String>() { public void accept(String data) { System.out.println(data); }}); -> ->
  36. 36. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.36 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.36 型推論の改善 型情報 (String) を省略可能 List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(new Predicate<String>() { public boolean test(String data) { return data.startsWith("a"); }}) .forEach(new Consumer<String>() { public void accept(String data) { System.out.println(data); }}); -> ->
  37. 37. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.37 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.37 メソッド引数部分の括弧 () の省略 単一引数の場合 () を省略可能 List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(new Predicate<String>() { public boolean test(String data) { return data.startsWith("a"); }}) .forEach(new Consumer<String>() { public void accept(String data) { System.out.println(data); }}); -> ->
  38. 38. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.38 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.38 単一行のブロックを省略 単一行の場合ブロック(return)を省略可能 List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(new Predicate<String>() { public boolean test(String data) { return data.startsWith("a"); }}) .forEach(new Consumer<String>() { public void accept(String data) { System.out.println(data); }}); -> ->
  39. 39. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.39 メソッド参照・コンストラクタ参照 Lambda 式で単に既存のメソッドを呼び出す場合、 メソッド参照の記法で簡易的に記述可能 (String data) -> System.out.println(data) System.out::println
  40. 40. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.40 メソッド参照・コンストラクタ参照 ラムダ式 メソッド参照 メソッド参照の種類 () -> Class.staticMethod() Class::staticMetho d クラスの static メソッドへの参照 () -> object.method() object::method オブジェクトのインスタンスメソッ ドへの参照 t -> t.method() Class::method 同一クラス任意オブジェクトのイン スタンスメソッドへの参照 () -> new Class() Class::new コンストラクタへの参照 ※ 引数が存在する場合、宣言順に渡される
  41. 41. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.41 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.41 メソッド参照による書き換え List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(new Predicate<String>() { public boolean test(String data) { return data.startsWith("a"); }}) .forEach(new Consumer<String>() { public void accept(String data) { System.out::println(data); }}); -> ->
  42. 42. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.42 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.42 Lambda 式 と Stream API 最終形式:Lambda 式により簡潔に記述可能 List<String> list = Arrays.asList("aaa", "bbb", "ccc", "abc"); list.stream() .filter(data -> data.startsWith("a”)) .forEach(System.out::println);
  43. 43. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.43 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.43 例題:俳優のフィルタリング public class Actor{ Integer id; //ID String firstName; //名前 String lastName; //名字 Integer age; //年齢 String prefecture; //出身の都道府県名 // … コンストラクタ・Setter, Getter は省略 }
  44. 44. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.44 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.44 例題:大河ドラマ(官兵衛)出演俳優 List<Actor> users = Arrays.asList( new Actor(1, “岡田”, “准一” , 33, “大阪府”), new Actor(2, “柴田”, “恭兵” , 62, “静岡県”), new Actor(3, “江口”, “洋介” , 46, “東京都”), new Actor(4, “竹中”, “直人” , 58, “神奈川県”), new Actor(5, "谷原", "章介” , 41, “神奈川県”), new Actor(6, "春風亭", "小朝” , 59, “東京都”), new Actor(7, "寺尾", "聰” , 67, “神奈川県”), new Actor(8, "速水", "もこみち” , 29, “東京都”), new Actor(9, "片岡", "鶴太郎” , 59, “東京都”), new Actor(10, “金子", "ノブアキ” , 33, “東京都”));
  45. 45. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.45 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.45 例題:年齢順にソート users.stream() .sorted(//年齢順にソート (act1, act2) ->act1.age.compareTo(act2.age)) .forEach(System.out::println); 8, 速水, もこみち, 29, 東京都 1, 岡田, 准一, 33, 大阪府 10, 金子, ノブアキ, 33, 東京都 5, 谷原, 章介, 41, 神奈川県 3, 江口, 洋介, 46, 東京都 4, 竹中, 直人, 58, 神奈川県 6, 春風亭, 小朝, 59, 東京都 9, 片岡, 鶴太郎, 59, 東京都 2, 柴田, 恭兵, 62, 静岡県 7, 寺尾, 聰, 67, 神奈川県
  46. 46. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.46 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.46 例題:出身県名一覧の表示 users.stream() .map(actor -> actor.getPrefecture()) .distinct() //重複文字列を削除 .forEach(System.out::println); map () : Actor から String オブジェクト(出身地の県名)を取得し 新たな Stream を生成 大阪府 静岡県 東京都 神奈川県
  47. 47. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.47 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.47 例題:出身県名一覧の取得 (List) List<String> prefectures = user2.stream() .map(actor -> actor.getPrefecture()) .distinct() .collect(Collectors.toList()); collect () : Stream の処理結果、別のオブジェクト(List, Set, Mapなど)で 値を取得したい場合、collect() を使用。 ユーティリティ・ファクトリ・クラス:Collectors
  48. 48. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.48 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.48 例題:40歳以上の人数を取得 long count = user2.stream() .filter(actor -> actor.age > 40) .count(); System.out.println("40歳以上は” + count+ "名"); 40歳以上は7名
  49. 49. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.49 Lambda 式ご利用時の ご注意
  50. 50. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.50 Lambda ご使用時の注意 Lambda 式は 匿名インナー・クラスの書き方を 単に書きかえた物ではありません。
  51. 51. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.51 1. 匿名インナー・クラスを実装したクラス import java.util.function.Supplier; public class Test{ public static void main(String... argv){ Supplier supplier = new Supplier() { @Override public String get() { return "Hello"; } }; } }
  52. 52. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.52 1. 匿名インナー・クラスを含むクラスを コンパイル > javac Test.java > ls Test$1.class Test.class Test.java 匿名インナークラスを含むクラスをコンパイルすると クラス名$***.class を生成
  53. 53. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.53 1. 匿名インナー・クラスを使用した場合 > javap -c Test public static void main(java.lang.String...); Code: 0: new #2 // class Test$1 3: dup 4: invokespecial #3 // Method Test$1."<init>":()V 7: astore_1 8: return 実行時インスタンスを生成して呼び出す
  54. 54. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.54 1. Lambda 式を含むクラスを コンパイル import java.util.function.Supplier; public class Test{ public static void main(String... argv){ Supplier s = () -> "Hello"; } } > javac Test.java > ls Test.class Test.java ※ Test$1.classクラスは未作成
  55. 55. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.55 > javap -p Test Compiled from "Test.java" public class Test { public Test(); public static void main(java.lang.String...); private static java.lang.Object lambda$main$0(); } 1. 生成されたクラスを確認 Lambda 式を使用すると同一クラス内に プライベート・メソッドを追加
  56. 56. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.56 1. 内部的に InvokeDyanamic を使用 > javap -c Test public static void main(java.lang.String...); Code: 0: invokedynamic #2, 0 // InvokeDynamic #0:get:()Ljava/util/function/Supplier; 5: astore_1 6: return Lambda 式を使用すると内部的に Java SE 7 で 追加された InvokeDynamic バイトコード命令を実行
  57. 57. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.57 2. ボディ内で this スコープの違い Supplier<String> anInner = new Supplier<String>() { @Override public String get() { return this.getClass().toString(); } }; CompletableFuture.supplyAsync(anInner).thenAccept(System.out::println); Supplier<String> lambda = () -> this.getClass().toString(); CompletableFuture.supplyAsync(lambda).thenAccept(System.out::println); Test$1 を返す Test を返す
  58. 58. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.58 Java SE 8 : CompletableFuture Java SE 8 で導入された CompletableFuture + Java EE 7 で導入された Concurrency Utilities
  59. 59. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.59 その他:本資料で説明していない項目 • プリミティブ型の Stream (IntStream など) • Parallel Stream (Parallel Aray) • Stream の全機能 • Optional Type • 例外ハンドリング • デフォルト・メソッド • インタフェース内の static メソッド
  60. 60. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.60 参考情報 • IT Pro連載記事「詳解 Java SE 8」をご参照 http://itpro.nikkeibp.co.jp/article/COLUMN/20140212/536246/ • JJUG:「祝☆Java 8 Launch」 http://www.java-users.jp/?p=917
  61. 61. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.61 JSR- 310 : Date & Time API 日付処理の開発容易性が向上
  62. 62. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.62 Date & Time API の目的 java.util.Date java.util.Calendar java.util.TimeZone java.text.DateFormat これらの API の置き換え用の新しい API を定義 イミュータブル&スレッド・セーフ ISO-8601 の国際標準規格に準拠
  63. 63. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.63 Date & Time API の主要なクラス LocalDateTime LocalDate LocalTime 人間的 (日時) ZonedDateTime Instantシステム的(瞬間)
  64. 64. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.64 プログラムでどのような時間処理が必要? どれを利用するかは 処理内容によって選ぶ必要があり
  65. 65. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.65 LocalDate タイムゾーン・時間情報は無し LocalDateTime LocalDate LocalTime 日本で使用するクレジット・カードの作成から有効期限まで 作成 2014年6月14日 有効期間 2017年6月14日 有効期間:3年間 期限切れ 2018年1月1日 警告 3週間前 新しいカード送信 3週間前の午前2時
  66. 66. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.66 LocalDate 現在の年月日を取得 LocalDateTime LocalDate LocalTime 日本で使用するクレジット・カードの作成から有効期限まで 作成 2014年6月14日 LocalDate regDate = LocalDate.now();
  67. 67. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.67 LocalDate 年月日の加減処理 (plus) LocalDateTime LocalDate LocalTime 日本で使用するクレジット・カードの作成から有効期限まで 作成 2014年6月14日 有効期間 2017年6月14日 有効期間:3年間 LocalDate regDate = LocalDate.now(); LocalDate expireDate = regDate.plusYears(3);
  68. 68. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.68 LocalDate 年月日の前後比較 LocalDateTime LocalDate LocalTime 日本で使用するクレジット・カードの作成から有効期限まで 作成 2014年6月14日 有効期間 2017年6月14日 有効期間:3年間 期限切れ 2018年1月1日 LocalDate regDate = LocalDate.now(); LocalDate expireDate = regDate.plusYears(3); LocalDate afterDate = LocalDate.of(2018, 1, 1); if (expireDate.isBefore(afterDate)) { …
  69. 69. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.69 LocalDate 年月日の加減処理 (minus) LocalDateTime LocalDate LocalTime 日本で使用するクレジット・カードの作成から有効期限まで 有効期間 2017年6月14日 警告 3週間前 LocalDate expireDate = regDate.plusYears(3); LocalDate warnDate = expireDate.minusWeeks(3);
  70. 70. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.70 LocalDate 年月日の調整 : TemporalAdjuster import static java.time.temporal.TemporalAdjusters.lastDayOfMonth; … LocalDate regDate = LocalDate.now(); LocalDate lastDay = regDate.with(TemporalAdjusters.lastDayOfMonth); LocalDate lastDay = regDate.with(lastDayOfMonth); //  スッキリ import static java.time.temporal.TemporalAdjusters.next; import static java.time.DayOfWeek.MONDAY; … LocalDate regDate = LocalDate.now(); LocalDate nextMonDay = regDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); LocalDate nextMonDay2 = regDate.with(next(DayOfWeek.MONDAY)); LocalDate nextMonDay3 = regDate.with(next(MONDAY)); //  スッキリ
  71. 71. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.71 LocalDate 年月日に時間情報を付加 LocalDateTime LocalDate LocalTime 日本で使用するクレジット・カードの作成から有効期限まで 警告日付 3週間前 新しいカード送信 3週間前の午前2時 LocalDate warnDate = expireDate.minusWeeks(3); LocalDateTime sendCardDateTime = warnDate.atTime(2, 0); LocalDate から LocalDateTime への変換
  72. 72. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.72 LocalDate Period : 日付間の差を取得 LocalDateTime LocalDate LocalTime Period period = Period.between(regDate, warnDate); Long days = ChronoUnit.DAYS.between(regDate, warnDate); System.out.println( "警告送信まで" + period.getYears() + "年" + period.getMonths() + "ヶ月" + period.getDays() + "日. (" + days + "日)"); //警告送信まで2年11ヶ月10日. (1075日)
  73. 73. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.73 LocalTime 時間処理:タイムゾーン・日付無し LocalDateTime LocalDate LocalTime LocalTime lTime = LocalTime.now(); LocalTime noon = LocalTime.of(12, 00); if (lTime.isAfter(noon)) { } LocalTime dinnerTime = noon.plusHours(8).minusMinutes(30).withNano(0); LocalTime trunTime = lTime.truncatedTo(ChronoUnit.MINUTES); LocalDateTime ldateTime = lTime.atDate(LocalDate.now()); タイムゾーン・日付の情報が不要なナノ秒単位の時間操作
  74. 74. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.74 LocalDateTime タイムゾーン情報無し LocalDateTime LocalDate LocalTime タイムゾーンが不要な日時処理 2014 年 06 月 25 日 午後6時 2015 年 01 月01 日 午前 0 時 正月まで 6ヶ月+6日+6時間
  75. 75. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.75 LocalDateTime LocalDate + LocalTime LocalDateTime LocalDate LocalTime LocalDateTime today = LocalDateTime.now(); LocalDateTime today = LocalDateTime.of(2014, Month.JUNE, 25, 18, 0); //2014-06-25T18:00:00 LocalDateTime nextNewYear = today.plusMonths(6).plusDays(6).plusHours(6); //2015-01-01T00:00 LocalDateTime firstMonday = newYear2.with(next(MONDAY)); //2015-01-05T00:00 タイムゾーン情報が不要な日時操作
  76. 76. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.76 Instant Instant start = Instant.now(); bar(); Instant end = Instant.now(); // Instant の比較には Duration を使用 Duration dur = Duration.between(start, end); long mills = dur.toMillis(); System.out.println("メソッドの実行時間" + mills); ある瞬間における時間を扱う Instant 瞬間の時間を操作
  77. 77. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.77 ZonedDateTime LocalDateTime startJUG = LocalDateTime.of(2014, Month.JULY, 25, 18, 00); ZoneId jap = ZoneId.of("Asia/Tokyo"); ZonedDateTime jpTimeZone = ZonedDateTime.of(startJUG, jap); //2014-07-25T18:00+09:00[Asia/Tokyo] String format = DateTimeFormatter .ofPattern("yyyy/MM/dd(E) a HH:mm").format(jpTimeZone); //2014/07/25(金) 午後 18:00 ZoneId los = ZoneId.of("America/Los_Angeles"); ZonedDateTime losTimeZone = jpTimeZone.withZoneSameInstant(los); //2014-07-25T02:00-07:00[America/Los_Angeles] LocalDateTime + ZoneId (UTC からのオフセット) ZonedDateTime タイムゾーンを含む日時を扱う
  78. 78. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.78 ZonedDateTime LocalDateTime startJUG = LocalDateTime.of(2014, Month.JULY, 25, 18, 00); String formatter2 = DateTimeFormatter.ofPattern("Gy年MM月dd日(E) a HH:mm").format(jpStartDateTime); //西暦2014年07月25日(月) 午後 18:00 JapaneseDate jdate = JapaneseDate.from(startJUG); String formatter3 = DateTimeFormatter.ofPattern("Gy年MM月dd日(E)").format(jdate); //平成26年07月25日(水) (ISO-8601 での実装を推奨) LocalDateTime + ZoneId (UTC からのオフセット) ZonedDateTime タイムゾーンを含む日時を扱う 日時の加減演算でサマー・タイム対応
  79. 79. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.79 IoT の時代に Java !!
  80. 80. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.80 今後 10 年
  81. 81. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.81 500億のデバイス
  82. 82. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.82 全てが繋がる 時代へ !!
  83. 83. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.83 Java SE 8 Compact プロファイル 各APIにどのプロファイルで 利用可能か記載されている 参考:https://blogs.oracle.com/jtc/entry/a_first_look_at_compact
  84. 84. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.84 デモ
  85. 85. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.85 IoT with WebSocket
  86. 86. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.86 LEGO(Java SE Embedded) & Java EE 7 WebSocket デモの構成 GlassFish v4.0.1 Java SE8/EE 7 Java SE8 Embedded LEGO MindStorms の操作命令を送信 LEGO MindStorms の状態情報を送信 WebSocket LEGO エンドポイント WebSocket サーバ エンドポイント WebSocket ブラウザ エンドポイント JSON JSON JSON JSON
  87. 87. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.87 ブラウザからLEGOマインドストームを操作 WebSocket でリアムタイム IoT 通信 ブラウザからの命令 前後左右への移動 停止、スピードアップ・ダウン LEGO からの情報 超音波センサー・データの表示 JSON でデータ送受信し RMI に比べ低オーバヘッド
  88. 88. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.88 Java SE 8/EE 7 だけで実現
  89. 89. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.89 今後 10 年も Java !!
  90. 90. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.90 Java SE 8 (JSR 337) 新機能 • JSR-308 : Annotations on types • JSR-310 : Date and Time API • JSR-335 : Lambda expressions 更新機能 • JSR-114 : JDBC Rowsets • JSR-160 : JMX Remote API • JSR-199 : Java Compiler API • JSR-173 : Streaming API for XML • JSR-221 : JDBC 4.0 • JSR-269 : Pluggable Annotation-Processing API
  91. 91. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.91 Language Core Libraries Virtual machine Security Platform Internationalisation
  92. 92. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.92 カテゴリ JEP ID 新機能の概要 --/-- 126 Lambda 式 と 仮想的な拡張メソッド(default method) --/-- 138 Autoconf-Based のビルド・システム --/-- 160 Lambda-Form Representation for Method Handles --/-- 161 コンパクト・プロファイル --/-- 162 モジュール化への準備 --/-- 164 AES 暗号化のために CPU 命令の活用 --/-- 174 Nashorn JavaScript エンジン --/-- 176 Mechanical Checking of Caller-Sensitive Methods --/-- 179 Document JDK API Support and Stability vm/-- 142 Reduce Cache Contention on Specified Fields vm/gc 122 パーマネント領域の削除 vm/gc 173 あまり使用されない GC の組み合わせの禁止 JDK 8 : JEP に記載される拡張機能 一覧
  93. 93. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.93 カテゴリ JEP ID 新機能の概要 vm/rt 136 Enhanced Verification Errors vm/rt 147 Reduce Class Metadata Footprint vm/rt 148 Small VM vm/rt 171 Fence Intrinsics core/-- 153 Launch JavaFX Applications core/lang 101 Generalized Target-Type Inference core/lang 104 Annotations on Java Types core/lang 105 DocTree API core/lang 106 Add Javadoc to javax.tools core/lang 117 Remove the Annotation-Processing Tool (apt) core/lang 118 Access to Parameter Names at Runtime core/lang 120 Repeating Annotations JDK 8 : JEP に記載される拡張機能 一覧
  94. 94. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.94 カテゴリ JEP ID 新機能の概要 core/lnag 139 Enhance javac to Improve Build Speed core/lnag 172 DocLint core/lib 103 Parallel Array Sorting core/lib 107 Bulk Data Operations for Collections core/lib 109 Enhance Core Libraries with Lambda core/lib 112 Charset Implementation Improvements core/lib 119 javax.lang.model Implementation Backed by Core Reflection core/lib 135 Base64 Encoding & Decoding core/lib 149 Reduce Core-Library Memory Usage core/lib 150 Date & Time API core/lib 155 Concurrency Updates core/lib 170 JDBC 4.2 JDK 8 : JEP に記載される拡張機能 一覧
  95. 95. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.95 カテゴリ JEP ID 新機能の概要 core/lib 177 Optimize java.text.DecimalFormat.format core/lib 178 Statically-Linked JNI Libraries core/lib 180 Handle Frequent HashMap Collisions with Balanced Trees core/i18n 127 Improve Locale Data Packaging and Adopt Unicode CLDR Data core/i18n 128 BCP 47 Locale Matching core/i18n 133 Unicode 6.2 core/net 184 HTTP URL Permissions core/sec 113 MS-SFU Kerberos 5 Extensions core/sec 114 TLS Server Name Indication (SNI) Extension core/sec 115 AEAD CipherSuites core/sec 121 Stronger Algorithms for Password-Based Encryption core/sec 123 Configurable Secure Random-Number Generation JDK 8 : JEP に記載される拡張機能 一覧
  96. 96. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.96 カテゴリ JEP ID 新機能の概要 core/sec 124 Enhance the Certificate Revocation-Checking API core/sec 129 NSA Suite B Cryptographic Algorithms core/sec 130 SHA-224 Message Digests core/sec 131 PKCS#11 Crypto Provider for 64-bit Windows core/sec 140 Limited doPrivileged core/sec 166 Overhaul JKS-JCEKS-PKCS12 Keystores web/jaxp 185 JAXP 1.5: Restrict Fetching of External Resources ご参照:http://openjdk.java.net/projects/jdk8/features JDK 8 : JEP に記載される拡張機能 一覧
  97. 97. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.97 最後に
  98. 98. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.98
  99. 99. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.99 Java Platform Standard Edition 8 ドキュメント http://docs.oracle.com/javase/jp/8/
  100. 100. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.100 Java リリース・ノート http://www.oracle.com/technetwork/jp/java/javase/overview/8train-relnotes-latest-2153846-ja.html
  101. 101. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.101 JDK 8 の新機能概要 http://www.oracle.com/technetwork/jp/java/javase/overview/8-whats-new-2157071-ja.html
  102. 102. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.102 JDK 8 の互換性・非互換性の情報ガイド http://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html
  103. 103. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.103 JDK 8 リリース時の既知の問題 http://www.oracle.com/technetwork/jp/java/javase/8-known-issues-2157115-ja.html
  104. 104. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.104 Java サポート・ロードマップ http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html
  105. 105. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.105 Java チュートリアル http://docs.oracle.com/javase/tutorial/tutorialLearningPaths.html
  106. 106. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.106 is Back
  107. 107. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.107 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.107

×