Java 8の全貌を短時間でつかむ! Java Magazine Vol.16の見どころ

今年3月のJava SE 8正式リリース後の最初の号となるJava Magazine日本版 第16号(2014年5月発行)は、現在Early Access版として提供されているJava ME 8の話題まで含めた、Java 8特集号となっている。本稿では、この第16号に掲載されている主なJava 8関連記事を紹介しよう。

特集「JAVA 8: EXPLORE THE POSSIBILITIES ~可能性を探る~」(P3)

 Java 8(Java SE 8とJava ME 8)で何が変わったのか、それを短時間で理解したいのなら、まずは本号の特集記事をご一読いただきたい。この記事では、ラムダ式、Nashorn(新しいJavaScriptエンジン)、Compactプロファイル(新しい組み込みプロファイル)、Date&Time API、JavaFX 8など、Java 8の主要な新機能の概要を網羅的に解説している。

 以下、ラムダ式の節に掲載されているコラムを抜粋しよう。

Java Language ArchitectのBrian Goetzが、より問合せ的な計算をコレクションに対して実行できるようにした、Javaコア・ライブラリの拡張について紹介します。

「"7曲以下しか含まれないアルバムを発表しているアーティスト"を探すようなケースについて考えてみましょう。そのためのコードはforループを使えば簡単に作成できますが、結果のコードは" どうやって" 処理するかに関する非本質的な詳細情報であふれているため、"何を"処理するかが明瞭ではありません」Java SE 8 で書いたコードは次のようになります。

Set artists = albums.stream()
  .filter(album -> album
  .getTracks().size() < 8).map(album -> album
  .getArtist()).collect(toSet());

「ここでの指示は、' アルバムの要素を受け取り、7 曲以下のアルバムを選び、そのアーティストを取得したら、集合に入れる' というものです。このコードは課題を読み解く事が簡単にできます。これは良いことです。なぜなら、読みやすいコードは、正しいコードである可能性も高いからです」とGoetz は述べます。

手書きのループからラムダ式とストリームを使用した集計処理へと移行すると、計算の制御が逆になります。Goetz は次のように説明します。「for ループを使用する場合、クライアントが各ステップを制御しながら、Iterator に対して反復のたびに次の要素を要求します。ラムダ式とストリームを使用する場合に制御権を握るのはライブラリですが、クライアントが簡単に計算をカスタマイズできる点に変わりはありません」

Goetz の説明は続きます。「先ほどのアルバム計算では、データを3回渡しているように見えますが、実際は3つが結合されて1回になっています。この結合が可能になった唯一の理由は、さまざまな動作を含むステップをパラメータ化することで、毎回のループ反復に関与することなく、クライアントが必要なすべての要素を1回の実行内に表現できるようになったからです」

 ラムダ式については、本号のインタビュー記事「Goldman Sachs とのQ&A」(P14)も参照されたい。この記事では、Goldman Sachsで開発された「FS Collections」というライブラリでJava SE 8のラムダ式がどのように活用されているかが語られている。

「Java SE 8ストリームを使用したデータ処理」(P40)

 Java SE 8で新たに追加されたSteam APIは、その名のとおりデータ・ストリームを扱うためのAPIだ。このAPIを使うことで、これまでコレクションを使って苦労して実装していた処理を、簡潔かつ明瞭にコーディングできるようになるという。本記事は、このStream APIの概要とその活用方法を解説する短期連載の第1回だ。

 以下、コレクションとストリームの違いについて説明している部分を引用しよう。

Javaの考え方として、既存のコレクションと新しいストリームはともに、一連の要素へのインタフェースを提供します。では、これらの違いは何でしょうか。一言で言えば、コレクションはデータに関する概念であり、ストリームは計算に関する概念です。DVD に収録された映画を例に挙げると、全体的なデータ構造が格納されているという点で、この映画はコレクションです(構成要素がバイト・データなのかフレームなのかはここでは不問です)。一方、同じ動画をインターネット経由のストリーミングにより視聴する場合には、この映画は(バイトまたはフレームの)ストリームとなります。このストリーミング・ビデオ・プレイヤーは、ユーザーが視聴する時点より先の数フレームのみをダウンロードしておけばよいのです。そうすれば、ストリーム内の大半の値を計算し終える前でも、ストリームの開始時点から値を表示し始めることができます(サッカーの試合のライブ・ストリーミングを思い浮かべてみてください)。

大ざっぱに言えば、コレクションとストリームの違いは、計算を実行するタイミングにあります。コレクションはメモリ内のデータ構造です。データ構造の現在の値がすべて、コレクション内に保持されます。つまり、コレクション内のすべての要素は、計算してからコレクションに追加する必要があります。これに対して、ストリームは、概念的には固定されたデータ構造ですが、そのデータ構造に格納される要素はオンデマンドで計算されます。 Collection インタフェースを使用するためには、ユーザーがイテレーションを記述する必要があります。そのためには、たとえば拡張形式のfor ループ(foreach と呼ばれる)を使用します。このようなイテレーションは、外部イテレーションと呼ばれます。

これに対して、Streams ライブラリでは内部イテレーションが使用されます。イテレーションや、出力されるストリームの値の保管が自動的に実行されます。開発者の作業は、何を実行するかを示す関数を指定することだけです。

 この記事では19本ものサンプル・コードを用いて、ストリーム・プログラミングの基本が詳しく解説されている(誌面に掲載されていないコードは、オンラインからダウンロードするためのリンクが張られている)。コレクションで苦労されている方は、ぜひ参考にしていただきたい。

「Raspberry Pi上で稼働するJavaFXと近距離無線通信」(P52)

 本記事では、組込みボードの「Raspberry Pi」とJava SE 8のJavaFX 8を用いて、近距離無線通信(NFC)を利用したカード・リーダー・システムを構築する方法が紹介されている。Java SE 8で登場したCompactプロファイルにより、組込み開発は以前に比べずっと敷居が低くなった。

 本記事は、Java SEのスキルセットを持っていることを前提としているものの、Raspberry Piのセットアップ(OSイメージやJava SE 8のインストール)から、手順を追って解説されている、この記事で紹介されているシステムは小規模なものだが、JavaFXインターフェースの作成、外部デバイス(カード・リーダー)の接続と制御、バックエンド(Java EEシステム)へのデータ送信、HTML5による情報の視覚化と、本格的なシステムを構築sるための要素が詰め込まれている。

 IoT(Internet of Things)というキーワードが象徴するように、組込みは今後の成長が期待できる分野だ。本記事で使われているOSイメージやサンプル・コードはすべてダウンロード可能なので、興味のある方はぜひチャレンジしていただきたい。

関連資料

第16号[2014年5月発行]
Java 8 特集
~組み込みからクラウドまでJava 8で実現~
日本オラクルxZDNet Japan 特別企画
特集トップへ
インフォメーション
Java Magazineに関するお問い合わせ先
日本オラクル株式会社
Oracle Technology Network事務局
お問い合わせ方法はこちら
提供:日本オラクル株式会社
[PR]企画・制作 朝日インタラクティブ株式会社 営業部  掲載内容有効期限:2014年8月30日
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]