Java8に触れてみた –StreamAPI編

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

ADMAGEユニットの小林です。

リリースが目前なのにあまり話題になっていないJava8の続きを書いてみます。
前回の記事Java8に注目してみましたではLambda式を書いていますが、今回はStream APIを中心にしてみます。

Java_clr_hori

【Stream API】

すごーくざっくりと説明すると、Collectionを操作するコードがシンプルに書けるようになる、というものです。
Lambda式の場合と同じく、Java7まででもできていたことを、よりシンプルに書けるようにするものです。

■forEach による全要素アクセス

List tmp = Arrays.asList("foo", "bar", "hoge");
tmp.forEach(str -> System.out.println(str));

結果

foo
bar
hoge

なんとなく直感で分かりそうですが、今までの書き方だとこうなります。

List tmp = Arrays.asList("foo", "bar", "hoge");
for(String str : tmp){
System.out.println(str);
}

どちらの書き方でも大差ないと感じるかもしれませんが今までの書き方の場合はリストの値にアクセスするのに型の指定が必要なのに対し、forEachとJava8の型推論を使った上のサンプルは、型の指定が必要ありません。
開発する段階では結構重宝しそうです。
(賛否両論あるとは思いますが)

■stream の取得

forEachは全要素へのアクセスでしたが、StreamAPIではフィルタリングをおこなって参照する要素を絞り込んだり、フィルタリングされた要素だけに同一の処理を行うなどができるようになっています。

List tmp = Arrays.asList("foo", "bar", "hoge");
tmp.stream().filter(str -> str.length() > 3).forEach(System.out::println);

●tmp.stream()
StreamAPIを使うためにStreamの取得を行います。
Colectionに用意されています。

●filter()
Colectionの各要素を条件によって絞り込みを行います。
条件の指定は「str -> str.length() > 3」となっていますが、こちらは前回の記事を参照していただければわかるかと思いますがLambda式で記載された無名メソッドです。
条件を満たす(true)になる要素のみを抽出します。
このfilterメソッドの戻り値もStreamになっています。

条件で絞られたStreamに対して、forEachで全件アクセスし、結果を表示してい ます。
(System.out::printlnはメソッド参照で、各要素をそのまま引数に渡しています)

こちらの結果は

hoge

となります。

条件を「str -> str.length() == 3」に変更すると、長さが3のものだけが参照されるので

foo
bar

となります。

なんとなくSQLを書いている感じでしょうか。
「テーブル(Collection)の要素に対して条件指定(filter)を行って対象を絞り込む」 そんなイメージで触っていました。

●map()

List tmp = Arrays.asList("foo", "bar", "hoge");
tmp.stream().map(str -> "[" + str + "]").forEach(System.out::println);

前回の記事でも各要素を[]で囲むサンプルを書きましたがStreamAPIを使っても可能です。
(Collectionの内容を書き換えるか、書き換えないかという違いがあります)

結果は

[foo]
[bar]
[hoge]

となります。

filter()を使って絞込んだものにmap()で加工、map()で加工したものをfilter()で絞込なども当然可能です。

StreamAPIはCollectionに対するアクセスを容易にします。
いろいろ書きたいのですが、今回の記事はここまでになります。
まだまだ機能があるので、続きはリリース後になるかと思いますが次の記事で書 きたいと思います。
他にもスレッド関連の新機能なども触ってみたので、記事にできたらなと。

個人的な感想として、Lambda式、StreamAPIのどちらも便利な機能なのですがもっと早くからこうなっていれば!と思っています。
正直、年をとって頭の硬くなった私には今までの書式と新しい書式がゴッチャゴチャになることが多いです。

約半年くらいJava8のbetaを見守ってきましたが、本日3月18日がリリース予定となって います。
正規リリースが待ち遠しいです。




広告システムについてのお問い合わせやご相談、パッケージ製品の詳細はこちらからどうぞ。
http://admage.jp/
アプリ計測SDK admage for Appのお問い合わせ・詳細はこちら。
http://apptizer.jp/

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

コメントを残す

*