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

小ネタ集

最近覚えた小ネタをのせていきます。 熟練のプログラマからすると当たり前のことが多いと思いますが・・・ Contents1 {}でスコープ限定2 リダイレクト:face-redirect=true3 H …

no image

Javaのarraycopy

最近あまりJava自体には触っていないですが、資格の勉強をコツコツとすすめていることもあり、新たな発見もあります。 8ヶ月ぐらいJava書いていますが、arraycopyというメソッドをはじめてしりま …

no image

glassfishとDB接続 ~CUI操作~

JavaEEではDBを使うときにglassfish内で設定が必要です。 基本的にはGlassFishでDB接続などのようにブラウザで管理画面から情報を入力することが可能です。 ただCUIや設定ファイル …

no image

Git→Jenkinsの連携 その2

以前、このエントリーでGitとjenkinsの連携に関して書いたんですが、今回jenkinsとgitのソースが別環境にあるケースの構築をしたのでメモしておきます。 Contents1 Jenkinsで …

no image

列挙型Enumについて

列挙型のクラスであるEnumについてのメモです。 ちなみにEnumの読み方はイナムまたはイニュームだそうです。 Contents1 列挙型とは?1.1 基本の使い方1.2 key=value的な使い方 …