Java
java8
jdk8
Java11
JDK11

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

"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

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