Java SE 8オーバービュー──言語仕様、コア・ライブラリ、プラットフォームはどう変わったのか?

Oracle Java & Developers編集部
2014-06-11 16:00:00
  • このエントリーをはてなブックマークに追加

コア・ライブラリの拡張

 続いては、コア・ライブラリの変更内容を見ていこう。

既存クラスのラムダ式への対応

 これに関してまず取り上げたいのは、すべての既存クラスをラムダ式に対応させたことだ。Java SE 7には4024のクラスが存在し、それらをラムダ式に対応させるのは容易な作業ではなかったが、これを行ったことによってクラス・ライブラリの大幅なパフォーマンス向上が期待できる。

並列処理の強化

 また、並列処理の性能を高めるために、さまざまな拡張を施している。例えば、スケーラブルな変数として「DoubleAccumulator」、「DoubleAdder」などを導入した。複数のスレッドが同じ変数を利用するとき、通常はロックを使って排他制御を行うが、これが効率低下の要因となっていた。DoubleAccumulatorやDoubleAdderは、「更新は頻繁だが、読み取り頻度はさほどでもない」といった状況で有効な変数だ。それぞれのスレッドに変数のコピーを持たせることで、スレッドはロックの取得を待たずに変数を更新できる。読み取りの際には、ライブラリ・コードが各スレッドの変数コピーをまとめて一意の結果を返す。

 ForkJoinPoolも改善した。I/O待ちによる遅延を減らすために、ジョブをスレッドに乗せることでI/O待ちスレッド以外のスレッドが処理を進められるようにしている。

 さらに、フィルタリングやマッピング、検索、ソートといった一連のデータ処理のパイプラインを構築するためのライブラリとして「Stream API」を追加した。ラムダ式やデフォルト・メソッドと併せて使うことで、振る舞いをシンプルに記述することが可能となる。直列処理を並列処理に変更したいときは、ストリームを並列化すればよい。並列処理に必要な複雑性は、ライブラリ・コードがすべて面倒を見てくれる。すべてのデータを読み込む必要はなく、最初のデータを取得してパイプラインに渡せば、処理を開始することができる。

 なお、これに関連して、関数インタフェースを提供するパッケージjava.util.functionが導入されている。主な関数インタフェースは次の4つだ。

  • Predicate<T>:T型の変数を受け取り、boolean値を返す。フィルタリングなどの条件判断で使用する
  • Consumer<T>:T型の変数を受け取り、何らかの処理を行う。戻り値はない
  • Function<T, R>:T型の値を受け取り、R型の変数を生成して返す
  • Supplier<T>:T型の値を返す

 そのほか、並列プログラミングの効率を高めるものとして、クラスjava.util.Arraysに並列ソートを可能にするメソッドparallelSortを追加した。このメソッドを使うことで、配列ソートの性能が、少なくとも30%は向上する。

新たな日時APIとしてDate and Time APIを追加

 オープンソースの日時API「Joda Time」をベースにした新たなAPIとして「Date and Time API」を追加した。これを使えば、日付や日時の計算を直感的に行うことができる。ISO-8601やCLDR、BCP47といった国際標準にも対応した。

JDBC 4.2

 JDBCには、Date and Time APIのデータ型に合わせて、既存のResultSetPreparedStatementCallableStatementといったクラス/インタフェースにメソッドを追加した。また、インタフェースCallableStatementには、REF_CURSORのサポートが追加されている。さらに、メタデータを扱うインタフェースDatabaseMetaDataでは、メソッドgetIndexInfoが拡張され、メソッドgetMaxLogicalLobSizeが追加されている。

標準のBase64 APIを導入

 これまで、Base64エンコードを扱うためにsun.misc.BASE64Encoder、sun.misc.BASE64DecoderといったプライベートなAPIが使われてきたが、標準APIとして、新たにjava.util.Base64.Encoderjava.util.Base64.Decoderが追加された。

国際化対応の改善

 国際化対応に関しては、クラスLocaleがBCP47に対応し、Unicode 6.2をサポートした。BCP47に対応したことで、アプリケーションの対応言語の範囲と優先度をコレクションとリストで表現することが可能となった。

セキュリティの改善

 証明書の認証方法を改善するために、新たに2つのインタフェースCertPathCheckerCertPathParametersを追加し、CA局へのコネクションをどのように扱うか(リトライ回数など)を定義できるようにした。これと併せて、デバッギング用のコマンドライン・オプション「-Djava.security.debug=certpath」も追加されている。

 また、これまでネットワーク・コネクションへのパーミッション割り当ては、IPアドレスに基づいて行われていたが、Java SE 8ではIPアドレスだけでなく、URLやHTTPメソッドに基づくパーミッション割り当てが可能となっている。

プラットフォームの変更

 最後に、Javaプラットフォームに加えられた変更を紹介する。

JavaFXの統合

 Java SE 8では、GUIフレームワークとして「JavaFX」が標準で組み込まれ、JavaFXのアプリケーションをコマンドラインから直接実行できるようになった。mainメソッドからJavaFXのライフサイクル・メソッドを呼び出すかたちではなく、JavaFXコードでアプリケーションを開始できるようになっている。

コンパクト・プロファイルの導入

 小型デバイス向けに、標準クラス・ライブラリのサブセットである「コンパクト・プロファイル(Compact Profiles)」を導入した。このプロファイルには、メモリ・フットプリントが異なる3つのプロファイルが用意されている。これに併せて、クラス・ローダにも変更を加えている。

JavaScriptエンジン「Nashorn」の採用

 「Nashorn」は、JavaScriptの最新仕様「ECMAScript-262 Edition 5.1」に対応した高性能なJavaScriptエンジンであり、Java SE 8のJREに統合されている。これに併せて、JavaScriptをJVMで実行するためのコマンドライン・ツールとして「jjs」を用意した。Nashornでは、エラー・メッセージの国際化対応も行われている。

 以上、駆け足となったが、Java SE 8に加えられた主な変更点を概観した。各機能の詳細については、本サイトの関連記事やオンライン・ドキュメントなどをご覧いただきたい。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]