Edited at

Java8からJava11への変更点


Java 8からJava 11

http://openjdk.java.net/projects/jdk9/

http://cr.openjdk.java.net/~iris/se/9/latestSpec/apidiffs/overview-summary.html

https://openjdk.java.net/projects/jdk/10/

http://cr.openjdk.java.net/~iris/se/10/latestSpec/apidiffs/overview-summary.html

https://openjdk.java.net/projects/jdk/11/

http://cr.openjdk.java.net/~iris/se/11/latestSpec/apidiffs/overview-summary.html


言語

まず言語についての変更点です。


var

http://openjdk.java.net/jeps/286

ローカル変数について型推論ができるようになりました。

var a = "Foo";

指針については次のような感じがいいかなと。



  • newList.ofなど右辺に型があるものはvarを使う方がいい(IntegerLongなど以外)


  • java.langjava.utilなどの基本的なクラスにはvarを使っていい


  • IntegerLongなどラッパークラスは扱い注意なのでvarを使わないほうがいい

  • 基本型にはvarを使ってもいい

  • アプリケーションクラスにはvarを使わないほうがいい

ラッパークラスの変数を使う場合はnullを扱うということなので、型を明示しておいたほうがいいと思います。nullを使わないなら基本型を。

項目1に当てはめると次のような書き方はOKになります。

var count = Long.valueOf("123");

けれども、IntegerLongのメソッドに関しては基本型を返すものとラッパー型を返すものが混在しているので、型を明示しておいたほうが安全です。

varで受け取る場合は基本型になっている、というふうにしておいたほうがいいと思います。


private interface methods

interfaceにprivateメソッドが使えるようになりました。

Java8 でdefault methodが使えるようになっているので、その共通処理をprivateで書くためです。


effective final in try-with-resource

http://openjdk.java.net/jeps/213

実質的にfinalな変数について、try-with-resourceで変数だけを指定することができるようになりました。

いままではtryの外で定義されたClosableな変数についてtry-with-resourceで自動closeしたいときは、別の変数に割り当てるということが必要でした。例えばfinallyで使いたいという場合にtryの外での変数定義が必要でしたが、そういう場合に使えます。

var io = new InputStream();

try (var io2 = io) {
...
}

var io = new InputStream();

try (io) {
...
}


<> in anonymous

匿名クラスにダイヤモンド演算子での型推論ができるようになりました。

List<String> strs = new ArrayList<>() {{

this.add("aa");
this.add("bb");
}};


_が利用不可

変数として_が使えないようになりました。


API

ここからは標準ライブラリの変更点についてクラスごとにまとめます。


java.lang


String


Conpact String

http://openjdk.java.net/jeps/254

ascii文字を効率よくメモリに保持できる


Indy String concatenation

http://openjdk.java.net/jeps/280

いままで、+での文字列の連結はStringBuilderに展開されましたが、InvokeDynamicで実行時に確定するようになります。

"aa"+ a

new StringBuilder("aa").append(a);



Dynamic Invoke


repeat(n)

繰り返せる


isBlank()

isBlankはUTFのスペース文字


strip() / stripLeading() / stripTrailing()

trim() / trimLeft() / trimRight()のUTF対応版


lines()


java.util


List/Set/Map


of

http://openjdk.java.net/jeps/269

Immutableなコレクションを返します


copyOf

Immutableなコピーを返す


Map


ofEntries() / entry()

MapにはofだけでなくofEntries()も追加されています。

var map = Map.ofEntries(

entry("key1", "value1"),
entry("key2", "value2"));


Predicate

not

メソッドリファレンスの反転が便利に


Collection


toArray(IntFunction)


Stream

dropWhile

takeWhile

ofNullable


iterate

引数2つのiterateはJava8からありましたが、必ずlimitなどで停止条件をつける必要がありました。

IntStream.iterate(0, i -> i + 3).limit(5)

.forEach(System.out::println);

takeWhileもなかったので、結構使いどころが難しかったです。

そして、takeWhileを組み合わせてiterateを使えるようになりました。

ということで、for文のように使えます。

IntStream.iterate(0, i -> i < 10, i -> i + 3)

.forEach(System.out::println);

これ、次のような書き方をすると帰ってこなくなります。なぜかは考えてみてください。

IntStream.iterate(0, i -> i < 10, i++)

.forEach(System.out::println);


Optional/OptionalInt/OptionalLong/OptionalDouble


orElseThrow()


isEmpty()


stream()


ifPresentOrElse


or


Collectors


toUnmodifiableList


toUnmodifiableSet


toUnmodifiableMap


filtering


flatMapping


Enumeration

asIterator


Objects


requireNonNullElse


requireNonNullElseGet


java.io


Path

of


Files


writeString


readString


Reader


transferTo


nullReader


Writer


nullWriter


InputStream


transferTo


nullInputStream


OutputStream


nullOutputStream


java.net.http


JVM


Log

http://openjdk.java.net/jeps/158

http://openjdk.java.net/jeps/271


G1GC is the default GC

http://openjdk.java.net/jeps/248


ZGC


CMS is deprecated

http://openjdk.java.net/jeps/291


Ahead of time compilation

http://openjdk.java.net/jeps/295


機能


JShell

http://openjdk.java.net/jeps/222


Launch Single-File Source-Code Programs


Module System


Java EE and CORBA is droped