いよいよ今日、Java 10がリリースされますね。
たぶんここからダウンロードできるようになると思います なりました。
http://jdk.java.net/10/

Java 10の新機能について、JEPがあるものについてはこちらにまとめました。
Java 10新機能まとめ - Qiita

ただ、JEPがあるもの以外にも結構変更はあります。
ここではJEP以外の変更について、影響がありそうなものをAPIとその他についてまとめてみます。
ここからの抽出です。詳しく知りたい人はこちらを。
109 New Features In JDK 10 - Azul Systems, Inc.

OpenJDKのダウンロードはこちら
JDK 10 GA Release

Oracle JDKのダウンロードはこちら
Java SE Development Kit 10- - Downloads

APIの変更

プロセスIDの取得

java.lang.management.RuntimeMXBeangetPid()メソッドが追加されて、プロセスIDが取れるようになりました。

import java.lang.management.ManagementFactory;

long pid = ManagementFactory.getRuntimeMXBean().getPid();
System.out.println(pid);

ちなみに、読みやすさを考えると、このような場合はvarは使わないほうがいいですね。
getPid()の定義をみればlongであることはわかるからvarでいい」とは言いがたい。

バージョン取得

Java 9でRuntime.version()が追加されましたが、それで取れるRuntime.Versionクラスが新しいバージョニングに従って変更されています。
feature()interim()update()patch()が追加され、major()minor()security()がDeprecatedになりました。

Runtime.Version version = Runtime.version();
System.out.printf("%d.%d.%d.%d%n",
        version.feature(), version.interim(), version.update(), version.patch());

ReaderからWriterへの転送

Java 9でjava.io.InputStreamtransferToメソッドが追加されてInputStreamからOutputStreamへの転送ができるようになっていましたが、Java 10ではjava.io.ReadertransferToメソッドが追加されて、ReaderでもWriterへの転送ができるようになりました。

var sr = new StringReader("abc\ndef\n");
var sw = new StringWriter();
sr.transferTo(sw);
System.out.println(sw);

こういったnewを使う場合は、右辺をみれば型がわかるので、varでいいと思います。

List/Set/Mapの変更不能なコピー作成

java.util.Listjava.util.Setjava.util.MapcopyOfメソッドが追加されて、Listなどのコピーが作れるようになりました。

var list = List.copyOf(List.of("aa", "bb", "cc"));

Listの場合は、java.util.ImmutableCollections$ListNという、List.ofでも使われている非公開クラスのインスタンスになっています。要素が0~2個の場合にはList0など専用クラスのインスタンスになります。
この例のように、もともとImmutableCollections$ListNだった場合には、与えたインスタンスがそのまま返されます。
JDK11ではListNに統一されそう。
http://hg.openjdk.java.net/jdk/jdk/rev/a14ede52a278

ところでcopyOfvarで受けていいかどうか微妙ですね。

Optinal/OptionalIntその他のorElseThrow()

Optionalその他にはすでにorElseThrow(Supplier<Throwable>)が用意されています。
Java 10では引数なしのorElseThrow()が追加されました。
get()メソッドはOptionalが値を持たないときには例外を投げます。そのため、この記事を書いた当初はorElseThrow()って必要ないのではと思って省略していたのですが、実際にはget()は例外が投げられることをちゃんと意識して使う必要があり、そうであればget()ではなくorElseThrow()を常用したほうがいいのではと思い至りました。
もしかしたら、将来的にはget()はDeprecatedになる可能性もあるという雰囲気らしい。

Streamからの変更不能なList/Set/Map生成

java.util.stream.CollectorstoUnmodifiableListtoUnmodifiableSettoUnmodifiableMapが追加されました。

List<String> strs = Stream.of("aa", "bb")
        .collect(Collectors.toUnmodifiableList());

toUnmodifiableSet()は重複があっても問題なく、どれかひとつが選ばれますが、toUnmodifiableMap()はキーに重複があるとjava.lang.IllegalStateExceptionが投げられます。

javax.ButtonModel#getGroup()

Swingにも変更が!!!

その他の変更

{@ Summary} JavaDocタグ

JavaDocのサマリーが、{@Summary}タグを使うと複数行で書けるようになりました。

Docker対応

いままで、DockerでJVMを動かしていてもCPU数やメモリなどはDockerの設定を無視してプラットフォームのCPU数やメモリサイズを返していましたが、Java 10からはDockerの設定を読むようになりました。
これはJavaをメインで使ってなくてもHadoopやSparkなどをDockerで使うときに影響があったので、ありがたい人も多いかも。

-d32 -d64の削除

JVMが32bit版か64bit版かを選ぶスイッチがありましたが、64bit版しか提供されなくなったのでこれらのスイッチはなくなりました。

policytoolの削除

削除されました

Kerberosの設定

INCLUDEDIR*.confというファイルがあると、krb5.confに取り込まれます。

まちがってDeprecatedになったものが復活

XMLInputFactory#newFactory()に間違って@Deprecatedがつけられていましたが、外されました。
こんなこともあるんですね。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.