Java8に触れてみた 続・StreamAPI編

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

ADMAGEユニットの小林です。

Java8に触れてみた 続・StreamAPI編

Java8が正式リリースされましたね。ちょうど前回の記事と同じタイミングでした。
前回の記事「Java8に触れてみた -StreamAPI編」ではStreamAPIを書いていますが、今回はその続きです。

【Stream API(2)】

**前回のおさらい**
Stream APIは「Collectionを操作するコードがシンプルに書けるようになる」もの。
CollectionからStreamを取得していろいろできます。

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

【要素の判定】

Collectionの各要素を調べ、1つでも××だったら、全部××だったらといった判定処理はよくあると思います。
Stream APIではこちらが機能として用意されていますので、見ていきます。

[allMatch]

「すべての要素が条件を満たしているか」を判定します。

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

結果

false

length()と比較している値を2に変更すると、すべての要素が満たしていることになり、trueが返ります。

[anyMatch]

「ひとつでも条件を満たす要素があるか」を判定します。

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

結果

true

[noneMatch]

「すべての要素が条件を満たさないか」を判定します。

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

結果

false

【コレクター】

Streamの処理結果を他のクラスに変換して取得することが可能です。
そのためにはStreamのcollect()を使います。
collect()の引数にCollectorオブジェクトを渡しますが、よく利用されそうな総計や文字連結などはCollectorsに用意されています。
Collectorは自作も可能です。

[文字連結]

全要素の文字連結を行ってStringを取得します。

List tmp = Arrays.asList("foo", "bar", "hoge");
System.out.println(tmp.stream().collect(Collectors.joining()));
System.out.println(tmp.stream().collect(Collectors.joining(":")));

結果

foobarhoge
foo:bar:hoge

[総計]

各要素を集計します。

List tmp = Arrays.asList("foo", "bar", "hoge");
System.out.println(tmp.stream().collect(Collectors.summingInt(str->str.length())));

結果

10

サンプルでは文字列の長さを集計しています。

[グルーピング]

結構便利そうな機能で、条件をキーマッチした要素をListに詰めたMapを返します。

List tmp = Arrays.asList("foo", "bar", "hoge");
System.out.println(tmp.stream().collect(Collectors.groupingBy(str->str.length())));

結果

{3=[foo, bar], 4=[hoge]}

[その他機能]

マッチングした要素、しない要素を分ける partitioningBy()、Streamからリストを取得する toList()など、いろいろべんりな機能が揃っていますので、それぞれ使ってみると面白いと思います。
一部リリース前からメソッドが変更されているので、チェックも必要かもしれません。

StreamAPIは今まで若干扱いづらかったCollectionを簡単便利に使えるように拡張している感じです。
また、最適化も行われているので、速度、メモリ管理の性能もそれなりのものが多くなっております。
APIにおんぶにだっこではプログラムを書いている意味がありませんが、その成り立ちがどのようなものかを理解できれば、より良いロジックが書けるのではないかなと思います。
ぜひStreamAPIを体験してみてください。

【おわりに】

正規リリースが行われたものの、正直あまりさわる時間がありませんでした。
幾つか正規版になって統廃合が行われてたようで、記事を読み返しながらなくなったものはないかなどのチェックが必要でした。
Java8が各社製品で使われるようになるのが何時頃になるのか気になります。
自社でいつ切り替わりがあってもいいように引き続きトレンドにはアンテナを立てていきたいと思います。





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

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

コメントを残す

*