skillup

技術ブログ

Java

Streamについて

投稿日:

Java8で導入されたStreamですが、名前はしっていたものの、使い方がわからず放置していました。

これを機に調べたのですが、コレクションフレームワークの拡張のようですね。
特徴としては以下のようなものがあげられます。

  • コレクションの要素に対する変換やフィルタリング、集計といった処理をラムダ式を使って記述できる。
  • コレクションに対する操作を並列化できるため、処理を簡単に高速化できる。

Stream活用法

例えば

name age pref
ichiro 30 chiba
jirou 18 tokyo
saburou 25 chiba
shirou 45 kanagawa
gorou 9 tokyo

のようなデータがList<Map<String,String>>であったとして、

  • 展開して全てを表示
  • 特定条件のデータだけを表示(例えば20才以上)
  • 条件が一致しているものがあるかを判定
  • 県別で分類

などを簡単に実現できます。特に「県別で分類」系の作業は自力でやろうとするととても面倒なので助かります。

この手の作業はめちゃくちゃよく出てきますし、自力で実装すると面倒なのとバグがでやすいので、ライブラリがあると非常に便利です。

早く知ってれば良かったです・・・(汗)

実際にコーディング例を紹介します。

展開して全てを表示(forEach)

まずは一番出てくる処理ですね。全体のループ表示です。

lsには上記のテーブルデータが入っています。

表示
name: ichirou :age 30 :pref chiba
name: jirou :age 18 :pref tokyo
name: saburou :age 25 :pref chiba
name: shirou :age 45 :pref kanagawa
name: gorou :age 9 :pref tokyo

抽出※例えば20才以上のものを抽出(filter)

表示
name: ichirou :age 30 :pref chiba
name: saburou :age 25 :pref chiba
name: shirou :age 45 :pref kanagawa

戻り値はStrem<型>ですね。数字系はIntStreamで表現します。(ここでは扱いません。)

ちなみに全て連結して下記のように表示することも可能です。(表示は同じです。)

条件が一致しているものがあるかを判定(anyMatch)

表示
true

県別で分類(Collectors.groupingBy)

これ手でやると結構大変です。

collectですが下記のような構造になっています。

型 Map<String, List<Map<String, String>>>

tokyo => [{pref=tokyo, name=jirou, age=18}, {pref=tokyo, name=gorou, age=9}]

chiba => [{pref=chiba, name=ichirou, age=30}, {pref=chiba, name=saburou, age=25}]

kanagawa => [{pref=kanagawa, name=shirou, age=45}]

表示
key: tokyo
name: jirou :age 18 name: gorou :age 9

key: chiba
name: ichirou :age 30 name: saburou :age 25

key: kanagawa
name: shirou :age 45

ちなみにMapの展開は下記のようになります。

表示
key: tokyo
合計年齢 27
平均年齢 13.5

key: chiba
合計年齢 55
平均年齢 27.5

key: kanagawa
合計年齢 45
平均年齢 45.0

-Java
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Javaでのメール送信プログラム

Javaでメール送信のプログラムがあったんで、メモ。 SMTPの認証とかはせず一番簡単なパターンです。 ケースでいうとサーバーA、サーバーBがあり下記のようなケースです。 A メールサーバー(smtp …

no image

CSVの入出力に関して

業務でCSVの入出力と格闘中。 まあよくある頻出の作業だったりするんですが、自前でやるとなかなか面倒です。 面倒なポイントとしては クオートのエスケープ カンマのエスケープ ヘッダーとの結合 ですかね …

no image

JSFのifタグ

JSFは基本的にテンプレートなので、 HTML+CSS+JavaScript ロジック側からの変数の出力 ループ処理 以上のことをさせることはあまりありません。 が、まれに条件分岐なんかをさせたいとき …

no image

便利すぎる道具の弊害

現在、Javaのプロジェクトでは会社でNetbeansを使っていますが、IDEを使っているばっかりに理解できていないところがありました。便利すぎる道具の弊害ですね・・・ IDEについて一応説明をしてお …

no image

Javadocに関して

業務で社内で使うクラスライブラリを作成中です。 他人に使ってもらうものなのでコメントやドキュメント周りの整備が必要になり、javadocをしっかり作りたいと思っています。 Contents1 java …