457はバイトコードを扱うためのAPIです。今までバイトコード操作というと、ASMなどが使われていましたが、標準のAPIで可能になります。今まで中間操作はストリームの流れてくる1データに対する処理に限定されていましたが、Gathereを使用するとかなり柔軟に中間操作を記述することができるようになります。軽くJEPを説明したところで、APIの変更について紹介していきましょう。JEPは多いのですが、意外にもAPIの変更は少ないです。457に関する変更です。JEPになった時に紹介します。FFMは別エントリーで紹介する予定です。例によって、セキュリティ関連のAPIは省略します。本バージョンでも、java.baseモジュール以外にもAPIの変更はありますが、使用頻度が低いAPIであるため、解説を省略します。22では1つのメソッドが廃止になりました。使用しても例外をスローする実装になっているので、廃止されても問題はないはずです。21まではUnsupportedOperationException例外をスローする実装になっています。22で追加された廃止予定のAPIはありません。8割ぐらいは、この2つのJEP由来の変更ということになります。本エントリーでは残りの2割を紹介していきます。java.base/java.ioパッケージjava.ioパッケージのConsoleクラスで1つだけメソッドが追加されました。ConsoleクラスConsoleオブジェクトで扱っているデバイスがターミナルかどうかを調べるメソッドが追加されました。isTerminal()ターミナルというのは標準入出力に対応したデバイス(POSIXでいうところのtty)です。ターミナルであればtrueが返ります。逆にいうと、JShellやIDEのコンソールだとfalseになります。15.1に対応したのでそれに応じたブロックの追加が行われました。これ以外にClassクラスとStackWalker.Option列挙型に追加があります。15.1で追加されたブロックの定数が追加されました。CJK_UNIFIED_IDEOGRAPHS_EXTENSION_IClassクラスプリミティブ型に対応するClassオブジェクトを取得するメソッドが追加されました。primitiveName)引数にはプリミティブ型を表す文字列、たとえば"int"とか"double"を指定します。引数がnullの場合、NullPointerException例外がスローされます。StackWalker.Option列挙型StackWalkerクラスはスレッドごとに作成されるスタックフレームを操作するクラスです。Option列挙型はStackWalkerオブジェクト生成時に使用する列挙型ですが、定数が1つ追加されました。DROP_METHOD_INFOStackWalkerオブジェクトがスタックフレームを操作する時にメソッドの情報を扱わないように指定します。java.base/java.lang.reflectパッケージいつものことですが、新しいリリースを表す定数が追加されています。22に対応する定数の追加です。RELEASE_22java.base/java.netパッケージIPv4/IPv6のアドレスを表すInet4Addressクラス/Inet6Addressクラスは直接生成することはできず、スーパークラスのファクトリメソッドを使用していました。これに対し、それぞれのクラスにファクトリメソッドが追加されました。InetAddressクラス"127.0.0.1"などに対応するInetAddressオブジェクトを生成するにはセグメントの配列を使用するgetByAddressメソッドか、ホスト名も使用できるgetByNameメソッドを使用してきました。これに対し、アドレスを文字列で指定するファクトリメソッドが追加されました。ipAddressLiteral)ofLiteralメソッドでは、引数の文字列をまずIPv4と仮定してパースを行います。失敗した場合、IPv6としてパースします。パースに失敗するとIllegalArgumentException例外がスローされます。実際の処理はInet4AddressクラスおよびInet6Addressクラスに委譲します。Inet4AddressクラスInet4Addressクラスにもアドレスを文字列で指定するファクトリメソッドが追加されました。ipv4AddressLiteral)アドレスの表記は今まで使用してきたのと同じです。d.d.d.d形式だけでなく、d.d.dからd.d、そしてd形式もパース可能です。/127.0.1.1jshell>Inet6AddressクラスInet6Addressクラスも同様にファクトリメソッドが追加されました。ipv6AddressLiteral)アドレスの表記も従来と同じで、::や::d.d.d.d形式なども使用できます。/0:0:0:0:0:0:0:1jshell>java.base/java.nio.charsetパッケージUTF-8などの標準的な文字セットを定数に持つStandardCharsetsクラスに定数が追加されました。StandardCharsetsクラスStandardCharsetsクラスではUTF-8やUTF-16系の定数は定義されていましたが、UTF-32系がなかったので追加されました。UTF_32LEjava.base/java.nio.fileパッケージPathインタフェースにデフォルトメソッドが追加されました。PathインタフェースPathインタフェースにresolveメソッドのオーバーロードが2種類追加されました。いずれもデフォルトメソッドです。more)実際の動作はfirstに対しresolveを行い、得られたPathオブジェクトに対しmoreを順々にresolveしていきます。実際のコードは以下のようになっています。}java.base/java.textパッケージリストをフォーマットするクラスが追加されました。ListFormatクラスListFormatクラスはリストのフォーマッタークラスです。なって導入されたのか、いまいち謎です。他のフォーマッターと同様にスタイルなどを指定する列挙型も導入されています。}ListFormatクラスの使い方は他のフォーマッタークラスと同じです。getInstanceメソッドでListFormatオブジェクトを生成し、フォーマットするのであればformatメソッド、パースをするのであればparseメソッドを使用します。主なメソッドを以下に示します。source)Objectクラスを引数にするformatメソッドと、parseObjectメソッドはFormatクラスで定義されたメソッドです。引数のないgetInstanceメソッドはデフォルトロケール、STANDARD、FULLとなります。StyleとTypeによるフォーマットの違いはListFormatクラスのJavadocにまとめられているので、参考にしてください。"a、b、c"jshell>ここで示したようにデフォルトの日本語ロケールだと、リストの区切り文字に全角の"、"が使われます。それはちょっとなぁと思うわけです。これに対し、たとえばUSロケールでSTANDARD/FULLだと次のようになります。"となるのは分かるのですが、これを使いたいことがあるのでしょうか。結局、よく使うのはTypeをSTANDARDではなくUNITにし、StyleはFULLかSHORTのような気がします。3"jshell>parseメソッドは戻り値の型がList<String>となることに注意してください。Framework関連でメソッドが追加されました。いずれも割り込みに関するメソッドです。ForkJoinPoolクラス割り込みがかからないタスク実行のメソッドが追加されています。tasks)複数のタスクをまとめて実行する時に使用するのがinvokeAllメソッドですが、それに割り込みがかからないようにしたのがinvokeAllUninterruptibly()メソッドです。このメソッドではタスクをjoinする時に、quitelyJoinメソッドを使用しているため、割り込みがかからないようになっています。ForkJoinTaskクラスForkJoinPoolクラスとは逆に、割り込みがかかるタスクのファクトリーメソッドが追加されました。result)今までのadoptメソッドでタスクを生成した場合、タスクに割り込みをかけることができませんでした。これに対し、adaptInterruptibleメソッドではタスクに対して割り込みを書けることができます。戻り値の型はForkJoinTaskクラスですが、実際には派生クラスのInterruptibleTaskクラスのさらに派生クラスであるAdaptedInterruptibleCallableクラスが戻ります。2種類のオーバーロードの違いは、引数の型が違うのでjoinした時の戻り値に違いがでるということです。Runnableインタフェースではタスクの戻り値がないので、adaptInterruptibleメソッドの第2引数のresultが返ります。java.base/java.util.randomパッケージ乱数値のストリームを生成するメソッドが追加されています。RandomGeneratorクラスRandomGeneratorクラスではdoubleの乱数値のストリームを生成するdoublesメソッドがあります。これの派生メソッドが追加されました。isRightIncluded)doublesメソッドでは要素数を指定しますが、equiDoublesメソッドは無限ストリームになります。22のAPI変更について紹介しましたが、やはり少ないですね。これは便利だとか、使えそうというAPIの追加もないようです。APIもASMを使っていた人にはうれしいはず。いっても、これらを使う開発者はごくごくわずかだとは思います。普通の開発者であれば、ストリームのGathererは便利に使えるはずです。APIが入るかどうかです。APIのAPI変更もないようなのですが、一波乱あるのかどうか。