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

JPAのdetach

このブログで何回か書いてきたんですが、JPAを使うときにpersisit=insert,merge=updateではないです。 参考リンク JPAまとめ JPAでのデータベースとの同期 実はJPAでf …

no image

CSVの保存、文字列としての出力

前回のエントリーではJSfでのCSVダウンロードについて書きましたが、実際にCSVの配列を作る処理について書きます。 CSVのアップロードの時に使ったのと同じCommonsCSVを使います。 Cont …

no image

ガベージコレクタに関して

本日はガベージコレクタに関して。 Contents1 ガベージコレクタとは?1.1 1 nullを代入1.2 2 参照変数を他のオブジェクトに割り当てる1.3 finalize()メソッドの定義 ガベ …

no image

DBUtils活用 その2

以前DBUtilsの活用を書きましたが、他の使い方がわかったのでメモ 以前はSelectでList<エンティティ>を取得したのですが、List<Map>でも取得できます。 ソー …

no image

配列の初期化&代入

最近、業務ではコードの量が肥大化し、とにかく短く書くことを心がけてます。 まあ、短ければいいってもんでもないんですが・・・ Listにクラスを使いするときに↓みたいな書き方を紹介したんですが、 [cr …