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

jenkins構築

いままでjenkinsについての記事を書いていなかったので記録しておこうと思います。 Contents1 jenkins構築2 設定ファイル変更(ポート&URL変更)3 セキュリティ有効化 jenki …

no image

JPAでのリレーションに関して

JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。 もともとクラスを作ってからDBを作成したり、JTAの規 …

no image

サーブレットのスコープ

JavaEEではスコープアノテーションによって変数のスコープを使い分けられたのですが、サーブレットの場合はプログラムの中で使い分けます。 通常はページ、リクエストとセッション、アプリケーションぐらいで …

no image

正規表現(判定:置換:抽出)

Javaの正規表現を利用した置換、抽出について書きます。 Contents1 正規表現の基本ルール2 Javaでの正規表現の処理の流れ3 実処理3.1 判定3.2 抽出3.3 置換 正規表現の基本ルー …

no image

Map,KeySetでのSteam

日常で一番よく使うMapループ系処理について Map KeySetのStreamでの書き方 Map<String,String>でEntrySetではなく、KeySetで展開したいときなど …