SlideShare a Scribd company logo
JavaOne2015報告
またはこれからのJava
2015年12月16日 きしだ なおき
今日のおはなし
● Javaの基本用語
● Java SE 9
● Java EE 8
Javaの基本用語
● Java SE
● Java EE
● JDK
● OpenJDK
● JSR
● JEP
Java SE
● Java Standard Edition
● Javaプラットフォームの仕様
– Java実行環境
– バイトコード
– 言語仕様
– 標準ライブラリ
– GUI
Java EE
● Java Enterprise Edition
● サーバー向けライブラリ仕様
– Web
– トランザクション
– セキュリティ
– メッセージング
– 管理機能
JDK
● Java Development Kit
● OracleのJava実装
– コンパイラ、VM、API、その他ツール
● Java SEは仕様、JDKは実装
– ただし、JDKのどこまでがJava SE仕様かはあいまい
– JavaFXはJava SEに含まれる?
OpenJDK
● オープンソースで開発されるJDK
● 現在のJava SEはOpenJDKとして機能が実装さ
れる
● クラスパス例外付GPL v2
– 標準APIに依存するソースコードにGPLが
波及しない
JEP
● JDK Enhancement Proposal
● JDK改善提案
● JDKはJEPの集まり
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
Java SE 9
● ロードマップ
● REPL
● JavaDoc
● 言語の変更
● ライブラリの小変更
● Flow API
● HttpClient
● Module
● Unsafe
● 実行環境
● 画像処理
Java SE 9 ロードマップ
● 2016/05/26 Feature Complete
● 2016/09/01 Rampdown Start
● 2017/01/26 Final Release Candidate
● 2017/03/23 General Availability
REPL(Read-Eval-Print Loop)
● JShellコマンド
● 学習のハードルをさげる
● メソッドの試行を楽に
– IDEが対応すれば、書いてすぐ試せる
JavaDoc
● HTML5対応
● 検索
言語の変更
● 匿名クラスでのダイアモンド推論
● try-with-resource前の初期化
匿名クラスでのダイアモンド推論
● 匿名クラスでもダイアモンド演算子が使える
ようになる
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”);
}
}
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);
ライブラリの変更
● Stream
● Optional.stream()
● コレクションのBuilder
Streamの変更
● Stream.takeWhile
● Stream.dropWhile
● Stream.ofNullable
Optional.stream()
● Optional.stream()
Stream.of(
Optional.of(“aa”),
Optional.empty(),
Optional.of(“bb”))
.flatMap(Optional::stream)
.collect(Collectors.toList());
コレクションの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), ...)
コレクションのBuilderの注意
● 実装はprivate
● immutable
● nullは入れられない
● setやmapのキーで重複があると例外
● setやmapの順序は不定
● メモリ効率のよい実装
Flow API
● JEP 266
● Reactive Stream
● Push Style API
– CompletableFuture ・・・ continuation-style
– Stream ・・・ pull-style
● java.util.concurrent.Flow
– Publisher/Subscriber/Processor/Subscription
HttpClient
● HTTP/2対応
● java.net.httpパッケージ
● シンプルなAPI
– HttpClient/HttpRequest/HttpResponse
HttpURLConnection
● 複数プロトコルに対応したURLConnectionの
一種だった
– FTP/GOPHER...
● 抽象的すぎて使うのが面倒
● HTTP/1.1に対応
HTTP/2
● HTTP/1.1の拡張
● SPDYをベース
● 1つのコネクションで複数のリクエスト
● サーバーPush
● ヘッダ圧縮
基本的な使い方
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);
}
レスポンス処理
● HttpResponse.asString()
● HttpResponse.asFile(path)
● HttpResponse.asByteArray()
POST
HttpResponse resp = HttpRequest
.create(new URI(“http://www.example.com/”))
.body(HttpRequest.fromString(“param1=1,param2=2”))
.POST()
.response()
POSTデータ
● fromString()
● fromFile(path)
● fromInputStream(input)
● fromByteArray(data)
非同期リクエスト
● CompletableFuture
CompletableFuture<HttpResponse> cf =
HttpRequest.create(uri)
.GET()
.responseAsync();
HttpResponse resp = cf.join();
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>
サーバー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();
Module
● Project Jigsaw
● モジュール定義
● JDKのモジュール分解
これまでのJavaの構造
● package
– class & interface
● field & method
Javaの構造
● module
– package
● class & interface
– field & method
今までの可視性
● public
● protected
● <package>
● private
これからの可視性
● すべてに対してpublic
● 特定のモジュールに対してpublic
● モジュール内でpublic
● protected
● <package>
● private
モジュール定義
● module-info.java
// src/kishida/util/module-info.java
module kishida.util {
exports kishida.util;
}
kishida.util
○kishida.util
×kishida.util.internal
依存
● requires
module kishida.util {
exports kishida.util;
}
kishida.util
module kishida.app {
requires kishida.util;
}
kishida.app
依存の伝播
● 孫依存のモジュール
module kishida.util {
exports kishida.util;
requires kishida.logging;
}
module kishida.app {
requires kishida.util;
requires kishida.logging;
}
module kishida.logging {
exports kishida.logging;
}
面倒
依存の伝播
● requires public
module kishida.util {
exports kishida.util;
requires public kishida.logging;
}
module kishida.app {
requires kishida.util;
}
module kishida.logging {
exports kishida.logging;
}
リフレクション
● setAccessible(true)も効かない
Unsafe
● sun.misc.Unsafe
● メモリの直接アクセスなどを行う
● モジュール化で行き所がなくなる
Unsafe
利用例 Unsafe
並列化プリミティブ Unsafe.compareAndSwap*
シリアライズ Unsafe.allocateInstance
メモリ管理 Unsafe.allocate/freeMemory
JVM外とのやりとり Unsafe.get*/set*
Unsafeを利用している製品
● Cassandra/Ehcache/HBase/Hadoop
Hibernate/JRuby/Netty/Scala/Spring...
Unsafeの廃止
● Java 9でメンテナンス停止
● Java $N-1で完全置き換え、Deprecate
● Java $Nで廃止
Unsafeの代替
利用例 代替
並列化プリミティブ JEP 193 Variable Handles
シリアライズ JEP 187 Serialization
メモリ管理 Project Panama
Project Valhalla
Arrays 2.0
JVM外とのやりとり Project Panama
JEP 191 FFI
実行環境
● G1GCのデフォルト化
● ログフォーマットの統一
画像処理
● マルチ解像度対応のImage
● フォントレンダリングの変更
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)
Java EE 8 ロードマップ
● 2015 Q4 Early Draft
● 2016 Q1 Public Review
● 2016 Q3 Proposed Final Draft
● 2017 H1 Final Release
Servlet 4.0(JSR 369)
● HTTP/2対応
● リクエスト・レスポンス多重化
● ストリームの優先順位
● サーバーPush
CDI 2.0(JSR 365)
● CDI for Java SE
● モジュール化
● 非同期イベント
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を
● テストが容易に
モジュール化
● CDI light
– Basic DI
– Producers
● Full CDI
– light
– Events
– Interceptor & Decorator
4つのモジュール
● CDI light for Java SE
● CDI full for Java SE
● CDI light for Java EE
● CDI full for Java EE
非同期イベント
@Inject
Event<Payload> event;
public void someLogic() {
event.fireAync(new Payload());
}
JAX-RS 2.1(JSR 370)
● HTTP/2対応
● Server Sent Event(SSE)
MVC 1.0(JSR 371)
● アクションベース
● JAX-RSをベースに
@Path(“hello”)
public class HelloController{
@GET
@Controller
public String hello(){
someProc();
return “hello.jsp”;
}
}
JSON
● JSON Binding(JSON-B/JSR 367)
● JSON Processing(JSON-P/JSR 374)
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);
JSON-P 1.1(JSR 374)
● JsonObjectやJsonArrayの操作
– JSON Pointer
– JSON Patch
● Java 8 Streamへの対応
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();
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");
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”
}
]
JsonPatchBuilder
JsonPatchBuilder builder = new JsonPatchBuilder();
JsonArray patch =
builder.replace("0/phones/mobile", "650-111-2222")
.remove("/1")
.build();
JsonArray result = patch.apply(contacts);
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());
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());

More Related Content

PDF
コンピューティングとJava~なにわTECH道
PDF
これからのコンピューティングとJava(Hacker Tackle)
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
PDF
機械学習プロ生20151121
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Javaトラブルに備えよう #jjug_ccc #ccc_h2
PDF
Native Memory Tracking
PPTX
Metaspace
コンピューティングとJava~なにわTECH道
これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
機械学習プロ生20151121
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Native Memory Tracking
Metaspace

What's hot (20)

PDF
Jvm internal
ODP
スレッドダンプの読み方
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
PPTX
Heap statsfx analyzer
PPTX
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
PPTX
第六回渋谷Java Java8のJVM監視を考える
PDF
Kink: invokedynamic on a prototype-based language
PDF
Hls friends 20161122.key
PDF
JVMの中身を可視化してみた
PDF
講座Java入門
PDF
キメるClojure
PDF
Introduction to JShell #JavaDayTokyo #jdt_jshell
PDF
Groovyで楽にSQLを実行してみよう
PDF
アドテク×Scala×パフォーマンスチューニング
PDF
MySQL日本語利用徹底入門
PPTX
JavaでインメモリSQLエンジンを作ってみた
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
Jbatch実践入門 #jdt2015
PDF
MySQLを割と一人で300台管理する技術
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Jvm internal
スレッドダンプの読み方
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
Heap statsfx analyzer
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
第六回渋谷Java Java8のJVM監視を考える
Kink: invokedynamic on a prototype-based language
Hls friends 20161122.key
JVMの中身を可視化してみた
講座Java入門
キメるClojure
Introduction to JShell #JavaDayTokyo #jdt_jshell
Groovyで楽にSQLを実行してみよう
アドテク×Scala×パフォーマンスチューニング
MySQL日本語利用徹底入門
JavaでインメモリSQLエンジンを作ってみた
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
Jbatch実践入門 #jdt2015
MySQLを割と一人で300台管理する技術
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Ad

Viewers also liked (16)

PDF
JavaOne2016報告
PDF
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
PPTX
乱数のたのしい話
PPTX
人工知能に何ができないか
PDF
Javaプログラミング入門
PPTX
ぼくの実装した最弱のディープラーニング
PDF
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
PDF
Java 9 preview
PDF
勉強会に参加しないと不幸になる話
PDF
職業人講和20141007
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PDF
JDK9 Features (Summary, 31/Jul/2015) #JJUG
PDF
ソフトウェア技術者はFPGAをどのように使うか
PDF
オブジェクト指向やめましょう
PDF
JDK9 新機能 (日本語&ショートバージョン) #jjug
PDF
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
JavaOne2016報告
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
乱数のたのしい話
人工知能に何ができないか
Javaプログラミング入門
ぼくの実装した最弱のディープラーニング
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
Java 9 preview
勉強会に参加しないと不幸になる話
職業人講和20141007
Java SE 8 lambdaで変わる プログラミングスタイル
JDK9 Features (Summary, 31/Jul/2015) #JJUG
ソフトウェア技術者はFPGAをどのように使うか
オブジェクト指向やめましょう
JDK9 新機能 (日本語&ショートバージョン) #jjug
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
Ad

Similar to JavaOne2015報告またはこれからのJava (20)

PPTX
Java EE8 Report
KEY
関ジャバ JavaOne Tokyo 2012報告会
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PPTX
福井イベント
PDF
Java scriptの進化
PDF
Spring3.1概要x di
PDF
今年はJava進化の年!今知っておくべき新しいJava
PDF
20161111 java one2016-feedback
PDF
Java EE 再入門
PDF
JavaScript時代のJava #kansumiB7 #kansumi
PDF
Spring framework
PDF
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
PDF
Javaで1から10まで書いた話(sanitized)
PPTX
JavaOne 2016 Report for Java EE
PDF
20161119 java one-feedback_osaka
PDF
大規模なギョームシステムにHaxeを採用してみた話
PDF
Play framework 2.0のおすすめと1.2からのアップグレード
PDF
Jakarta EE 9 と これから
PDF
Head toward Java 15 and Java 16
ODP
ホット・トピック・セミナー「Metro」
Java EE8 Report
関ジャバ JavaOne Tokyo 2012報告会
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
福井イベント
Java scriptの進化
Spring3.1概要x di
今年はJava進化の年!今知っておくべき新しいJava
20161111 java one2016-feedback
Java EE 再入門
JavaScript時代のJava #kansumiB7 #kansumi
Spring framework
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Javaで1から10まで書いた話(sanitized)
JavaOne 2016 Report for Java EE
20161119 java one-feedback_osaka
大規模なギョームシステムにHaxeを採用してみた話
Play framework 2.0のおすすめと1.2からのアップグレード
Jakarta EE 9 と これから
Head toward Java 15 and Java 16
ホット・トピック・セミナー「Metro」

More from なおき きしだ (19)

PDF
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
PDF
GraalVM at Fukuoka LT
PDF
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
PDF
GraalVMについて
PDF
VRカメラが楽しいのでブラウザで見たくなった話
PDF
最近のJava事情
PDF
怖いコードの話 2018/7/18
PDF
Java新機能観察日記 - JJUGナイトセミナー
PDF
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
PDF
これからのコンピューティングの変化とこれからのプログラミング at 広島
PDF
Summary of JDK10 and What will come into JDK11
PDF
Summary of JDK10 and What will come into JDK11
PDF
Java10 and Java11 at JJUG CCC 2018 Spr
PPTX
New thing in JDK10 even that scala-er should know
PPTX
Java Release Model (on Scala Matsuri)
PDF
これからのJava言語と実行環境
PDF
JavaOne報告2017
PDF
JavaOne2017で感じた、Javaのいまと未来 in 大阪
PDF
GPUをJavaで使う話(Java Casual Talks #1)
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVM at Fukuoka LT
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
GraalVMについて
VRカメラが楽しいのでブラウザで見たくなった話
最近のJava事情
怖いコードの話 2018/7/18
Java新機能観察日記 - JJUGナイトセミナー
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
これからのコンピューティングの変化とこれからのプログラミング at 広島
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11
Java10 and Java11 at JJUG CCC 2018 Spr
New thing in JDK10 even that scala-er should know
Java Release Model (on Scala Matsuri)
これからのJava言語と実行環境
JavaOne報告2017
JavaOne2017で感じた、Javaのいまと未来 in 大阪
GPUをJavaで使う話(Java Casual Talks #1)

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