ブログ記事の転載です。
Java9リリースが2017年7月に迫ってきたということで、
Java9で新しく出来るようになることをサンプルコードと一緒に紹介していきます。
なお、すべてリリース前の情報ですので、
実際にリリースされるJava9では異なる場合があるので注意してください。
Java10リリースが迫ってきましたね、リンク貼っておきます。
Java 10新機能まとめ
目次
- JShell
- 不変List/Set/Map用のファクトリメソッド
- Interface内のprivateメソッド
- モジュールシステム
- Process APIの改善
- try-with-resourceの改善
- CompletableFuture APIの改善
- リアクティブストリーム
- 匿名クラスでのダイアモンド演算子
- Optionalクラスの改善
- Stream APIの改善
- @Deprecatedアノテーションの強化
- HTTP2クライアント
- Multi-Resolution Image API
- その他もろもろ
JShell
REPL環境です。
コマンドラインからJavaを実行して、
APIの確認やら簡単なテストができるようになりました。
C:\>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> String helloWorld = "Hello World"
helloWorld ==> "Hello World"
jshell> System.out.println(helloWorld + "!!" )
Hello World!!
不変List/Set/Map用のファクトリメソッド
タイトルの通りです。
Guava(Googleの共通処理ライブラリ)風にList/Set/Mapを作れるようになりました。
jshell> List emptyImmutableList = List.of();
emptyImmutableList ==> []
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
Interface内のprivateメソッド
Java8ではInterfaceにdefaultメソッドとstaticメソッドが定義できるようになりました。
Java9では、privateメソッドも定義できるようになります。
public interface Card{
private Long createCardID();
private static void displayCardDetails();
}
モジュールシステム
Jigsawプロジェクトと呼ばれていたやつです。
公開するAPI、非公開APIをmodule-info.javaに定義することが出来るようになりました。
こちらの記事にサンプルコードが載っています。
Process APIの改善
以下のクラスが追加されました。
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
try-with-resourceの改善
Java8までのtry-with-resource文は、
try節の中でクラスを宣言することが必須だったのですが、
これが不要になりました。
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
CompletableFuture APIの改善
CompletableFuture APIに、
- 遅延
- タイムアウト
- いくつかのユーティリティメソッド
- より良いサブクラス化をサポート
等の機能が追加されました。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
リアクティブストリーム
非同期処理/並列処理/スケーラブルなアプリ開発をすすめるために、
Publish/Subscribe Frameworkが追加されました。
Akka等にある仕組みです。
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
こちらにサンプルコードが載っています。
匿名クラスでのダイアモンド演算子
詳細がわからなかったので省略。
Optionalクラスの改善
Optionalクラスにいろいろ追加されました。
- public void ifPresentOrElse(Consumerl super Tl> action, Runnable emptyAction)
- public Optional
<T>
or(Supplier extends Optional extends T>> supplier) - Optional::stream
Optional::streamをStream#flatMapに渡すことで、
包まれていたクラスのStreamに変換できるみたいです。
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
Stream APIの改善
Scala同様に書けるtakeWhileメソッド、dropWhileメソッドが追加されました。
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
.forEach(System.out::println);
1
2
3
4
@Deprecatedアノテーションの強化
廃止予定なのか?(forRemoval)
いつ廃止するのか?(since)
といった情報が与えられるようになったようです。
HTTP2クライアント
こちらはインキュベーション機能に格下げになってしまったようです...。
参考
HTTP/2 ClientはJava 9に含まれるが、デフォルトではアクセスできないだろうということだ。機能はjdk.incubatorというプレフィクスのモジュールにパッケージされる。それにアクセスする開発者は明示的に--add-modフラグを使う必要がある。しかし、もしこうすることを選択すると、インキュベーション機能は標準APIの一部ではなく、それゆえにいつでも修正されることを考慮する必要があるだろう。
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("http://google.com")
uri ==> http://google.com
jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d
jshell> System.out.println("Response was " + response.body(asString()))
Multi-Resolution Image API
java.awt.imageパッケージにMultiResolutionImageインターフェースが追加されたそうです。
詳細は公式docで
その他もろもろ
他にも
- GC (Garbage Collector)の改善
- Stack-Walking API
- Filter Incoming Serialization Data
- Applet APIの非推奨(Deprecate)
- Indify String Concatenation
- Method Handlesの強化
- Java Platform Logging API and Service
- コンパクトなStrings
- Nashorn用Parser API
- Javadocに検索機能
- JavadocをHTML5に
等があるそうです。