JavaOne2015報告またはこれからのJava

237
-1

Published on

JavaOne2015の報告資料。Java SE 9/Java EE 8まとめ

Published in: Software
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
237
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

JavaOne2015報告またはこれからのJava

  1. 1. JavaOne2015報告 またはこれからのJava 2015年12月16日 きしだ なおき
  2. 2. 今日のおはなし ● Javaの基本用語 ● Java SE 9 ● Java EE 8
  3. 3. Javaの基本用語 ● Java SE ● Java EE ● JDK ● Open JDK ● JSR ● JEP
  4. 4. Java SE ● Java Standard Edition ● Javaプラットフォームの仕様 – Java実行環境 – バイトコード – 言語仕様 – 標準ライブラリ – GUI
  5. 5. Java EE ● Java Enterprise Edition ● サーバー向けライブラリ仕様 – Web – トランザクション – セキュリティ – メッセージング – 管理機能
  6. 6. JDK ● Java Development Kit ● OracleのJava実装 – コンパイラ、VM、API、その他ツール ● Java SEは仕様、JDKは実装 – ただし、JDKのどこまでがJava SE仕様かはあいまい – JavaFXはJava SEに含まれる?
  7. 7. Open JDK ● オープンソースで開発されるJDK ● 現在のJava SEはOpen JDKとして機能が実装 される ● クラスパス例外付GPL v2 – 標準APIに依存するソースコードにGPLが 波及しない
  8. 8. JEP ● JDK Enhancement Proposal ● JDK改善提案 ● JDKはJEPの集まり
  9. 9. JSR ● Java Specification Request ● Javaの標準仕様 ● Specification Leadsを中心に、Expert Groupが作業を行う ● Java EEはJSRの集まり – Java EE自体JSRで定義されている ● 例 – JSR-310 Date and Time API – JSR-366 Java Platform, Enterprise Edition 8 Specification
  10. 10. Java SE 9 ● ロードマップ ● REPL ● JavaDoc ● 言語の変更 ● ライブラリの小変更 ● Flow API ● HttpClient ● Module ● Unsafe ● 実行環境 ● 画像処理
  11. 11. Java SE 9 ロードマップ ● 2016/05/26 Feature Complete ● 2016/09/01 Rampdown Start ● 2017/01/26 Final Release Candidate ● 2017/03/23 General Availability
  12. 12. REPL(Read-Eval-Print Loop) ● JShellコマンド ● 学習のハードルをさげる ● メソッドの試行を楽に – IDEが対応すれば、書いてすぐ試せる
  13. 13. JavaDoc ● HTML5対応 ● 検索
  14. 14. 言語の変更 ● 匿名クラスでのダイアモンド推論 ● try-with-resource前の初期化
  15. 15. 匿名クラスでのダイアモンド推論 ● 匿名クラスでもダイアモンド演算子が使える ようになる Map<String, String> params = new HashMap<String, String>(){ { put(“a”, “123”); put(“b”, “456”); } } Map<String, String> params = new HashMap<>(){ { put(“a”, “123”); put(“b”, “456”); } }
  16. 16. try-with-resource前の初期化 ● try-with-resourceの前で初期化が可能 final Resource r = new Resource(); try(r){ ... } use(r); final Resource r = new Resource(); try(Resource r2 = r){ ... } use(r);
  17. 17. ライブラリの変更 ● Stream ● Optional.stream() ● コレクションのBuilder
  18. 18. Streamの変更 ● Stream.takeWhile ● Stream.dropWhile ● Stream.ofNullable
  19. 19. Optional.stream() ● Optional.stream() Stream.of( Optional.of(“aa”), Optional.empty(), Optional.of(“bb”)) .flatMap(Optional::stream) .collect(Collectors.toList());
  20. 20. コレクションのBuilder ● List – List.of(e1, e2, e3, ...) ● Set – Set.of(e1, e2, e3, ...) ● Map – Map.of(k1, v1, k2, v2, k3, v3, ...) – Map.of(entity(k1, v1), entity(k2, v2), ...)
  21. 21. コレクションのBuilderの注意 ● 実装はprivate ● immutable ● nullは入れられない ● setやmapのキーで重複があると例外 ● setやmapの順序は不定 ● メモリ効率のよい実装
  22. 22. Flow API ● JEP 266 ● Reactive Stream ● Push Style API – CompletableFuture ・・・ continuation-style – Stream ・・・ pull-style ● java.util.concurrent.Flow – Publisher/Subscriber/Processor/Subscription
  23. 23. HttpClient ● HTTP/2対応 ● java.net.httpパッケージ ● シンプルなAPI – HttpClient/HttpRequest/HttpResponse
  24. 24. HttpURLConnection ● 複数プロトコルに対応したURLConnectionの 一種だった – FTP/GOPHER... ● 抽象的すぎて使うのが面倒 ● HTTP/1.1に対応
  25. 25. HTTP/2 ● HTTP/1.1の拡張 ● SPDYをベース ● 1つのコネクションで複数のリクエスト ● サーバーPush ● ヘッダ圧縮
  26. 26. 基本的な使い方 HttpResponse resp = HttpRequest .create(new URI(“http://www.example.com/”)) .GET() .response(); if(resp.statusCode() == 200){ String responseBody = resp.body(HttpResponse.asString()); System.out.println(responseBody); }
  27. 27. レスポンス処理 ● HttpResponse.asString() ● HttpResponse.asFile(path) ● HttpResponse.asByteArray()
  28. 28. POST HttpResponse resp = HttpRequest .create(new URI(“http://www.example.com/”)) .body(HttpRequest.fromString(“param1=1,param2=2”)) .POST() .response()
  29. 29. POSTデータ ● fromString() ● fromFile(path) ● fromInputStream(input) ● fromByteArray(data)
  30. 30. 非同期リクエスト ● CompletableFuture CompletableFuture<HttpResponse> cf = HttpRequest.create(uri) .GET() .responseAsync(); HttpResponse resp = cf.join();
  31. 31. CompletableFuture HttpRequest.create(uri) .GET() .responseAsync(); .thenApplyAsync((HttpResponse resp) -> { if(resp.statusCode() = 200){ return resp.body(asFile(path)); }else { throw new SomeException(); } }); // output is CompletableFuture<Path>
  32. 32. サーバーPush CompletableFuture<Map<URI, PATH>> cf = HttpRequest.create(uri) .version(Version.HTTP_2) .GET() .multiResponseAsync( HttpResponse.multiFile(“/usr/dest”); Map<URI, Path> results = cf.join();
  33. 33. Module ● Project Jigsaw ● モジュール定義 ● JDKのモジュール分解
  34. 34. これまでのJavaの構造 ● package – class & interface ● field & method
  35. 35. Javaの構造 ● module – package ● class & interface – field & method
  36. 36. 今までの可視性 ● public ● protected ● <package> ● private
  37. 37. これからの可視性 ● すべてに対してpublic ● 特定のモジュールに対してpublic ● モジュール内でpublic ● protected ● <package> ● private
  38. 38. モジュール定義 ● module-info.java // src/kishida/util/module-info.java module kishida.util { exports kishida.util; } kishida.util ○kishida.util ×kishida.util.internal
  39. 39. 依存 ● requires module kishida.util { exports kishida.util; } kishida.util module kishida.app { requires kishida.util; } kishida.app
  40. 40. 依存の伝播 ● 孫依存のモジュール module kishida.util { exports kishida.util; requires kishida.logging; } module kishida.app { requires kishida.util; requires kishida.logging; } module kishida.logging { exports kishida.logging; } 面倒
  41. 41. 依存の伝播 ● requires public module kishida.util { exports kishida.util; requires public kishida.logging; } module kishida.app { requires kishida.util; } module kishida.logging { exports kishida.logging; }
  42. 42. リフレクション ● setAccessible(true)も効かない
  43. 43. Unsafe ● sun.misc.Unsafe ● メモリの直接アクセスなどを行う ● モジュール化で行き所がなくなる
  44. 44. Unsafe 利用例 Unsafe 並列化プリミティブ Unsafe.compareAndSwap* シリアライズ Unsafe.allocateInstance メモリ管理 Unsafe.allocate/freeMemory JVM外とのやりとり Unsafe.get*/set*
  45. 45. Unsafeを利用している製品 ● Cassandra/Ehcache/HBase/Hadoop Hibernate/JRuby/Netty/Scala/Spring...
  46. 46. Unsafeの廃止 ● Java 9でメンテナンス停止 ● Java $N-1で完全置き換え、Deprecate ● Java $Nで廃止
  47. 47. Unsafeの代替 利用例 代替 並列化プリミティブ JEP 193 Variable Handles シリアライズ JEP 187 Serialization メモリ管理 Project Panama Project Valhalla Arrays 2.0 JVM外とのやりとり Project Panama JEP 191 FFI
  48. 48. 実行環境 ● G1GCのデフォルト化 ● ログフォーマットの統一
  49. 49. 画像処理 ● マルチ解像度対応のImage ● フォントレンダリングの変更
  50. 50. Java EE 8 ● ロードマップ ● Servlet 4.0(JSR 369) ● CDI 2.0(JSR 365) ● JAX-RS 2.1(JSR 370) ● MVC 1.0(JSR 371) ● JSON – JSON Binding 1.0(JSR 367) – JSON-P 1.1(JSR 374)
  51. 51. Java EE 8 ロードマップ ● 2015 Q4 Early Draft ● 2016 Q1 Public Review ● 2016 Q3 Proposed Final Draft ● 2017 H1 Final Release
  52. 52. Servlet 4.0(JSR 369) ● HTTP/2対応 ● リクエスト・レスポンス多重化 ● ストリームの優先順位 ● サーバーPush
  53. 53. CDI 2.0(JSR 365) ● CDI for Java SE ● モジュール化 ● 非同期イベント
  54. 54. CDI for Java SE CDIProvider provider = CDI.getCDIProvider(); CDI<Object> cdi = provider.initialize(); MyBean bean = cdi.select(MyBean.class).get(); bean.some(); cdi.shutdown(); ● Java SEでもCDIを ● テストが容易に
  55. 55. モジュール化 ● CDI light – Basic DI – Producers ● Full CDI – light – Events – Interceptor & Decorator
  56. 56. 4つのモジュール ● CDI light for Java SE ● CDI full for Java SE ● CDI light for Java EE ● CDI full for Java EE
  57. 57. 非同期イベント @Inject Event<Payload> event; public void someLogic() { event.fireAync(new Payload()); }
  58. 58. JAX-RS 2.1(JSR 370) ● HTTP/2対応 ● Server Sent Event(SSE)
  59. 59. MVC 1.0(JSR 371) ● アクションベース ● JAX-RSをベースに @Path(“hello”) public class HelloController{ @GET @Controller public String hello(){ someProc(); return “hello.jsp”; } }
  60. 60. JSON ● JSON Binding(JSON-B/JSR 367) ● JSON Processing(JSON-P/JSR 374)
  61. 61. JSON Binding 1.0(JSR 367) ● JavaオブジェクトとJSONのバインディング ● JsonBuilder Person p = new Person(); p.setName(“きしだ”); p.setAddress(“ふくおか”); p.setTwitter(“@kis”); Jsonb jsonb = JsonbBuilder.create(); jsonb.toJson(p, System.out);
  62. 62. JSON-P 1.1(JSR 374) ● JsonObjectやJsonArrayの操作 – JSON Pointer – JSON Patch ● Java 8 Streamへの対応
  63. 63. JSONの構築 ● createObjectBuilder ● createArrayBuilder JsonArray contacts=Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("name","Duke") .add("gender","M") .add("phones",Json.createObjectBuilder() .add("home","650-123-4567") .add("mobile","650-234-5678"))) .add(Json.createObjectBuilder() .add("name","Jane") .add("gender","F") .add("phones",Json.createObjectBuilder() .add("mobile","707-555-9999"))) .build();
  64. 64. JSON Pointer ● RFC 6901 [ { "name":"Duke", "gender":"M", "phones":{ "home":"650-123-4567", "mobile":"650-555-1212"}}, { "name":"Jane", "gender":"F", "phones":{ "mobile":"707-555-9999"}} ] JsonPointer p = new JsonPointer("/0/phones/mobile"); contacts = p.replace(contacts, "650-555-1212");
  65. 65. JSON Patch ● RFC 6902 ● add, replace, remove, mode, copy, test ● PatchはJSONで記述 [ { “op”:”replace”, “path”:”/0/phones/modile”, “value”:”650-111-2222” }, { “op”:”remove”, “path”:”/1” } ]
  66. 66. JsonPatchBuilder JsonPatchBuilder builder = new JsonPatchBuilder(); JsonArray patch = builder.replace("0/phones/mobile", "650-111-2222") .remove("/1") .build(); JsonArray result = patch.apply(contacts);
  67. 67. Stream対応 JsonArray contacts = ...; List<String> femaleNames = contacts.getValuesAs(JsonObject.class).stream() .filter(x->"F".equals(x.getString("gender"))) .map(x->(x.getString("name")) .collect(Collectors.toList());
  68. 68. JsonCollector JsonArray contacts = ...; JsonArray femaleNames = contacts.getValuesAs(JsonObject.class).stream() .filter(x->"F".equals(x.getString("gender"))) .map(x->(x.getString("name")) .collect(JsonCollectors.toJsonArray());
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×