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を使用する  JavaSE編

現在の開発ではデータベースへの接続ではJPAを使っています。このJPAがなかなか曲者でいろいろと詰まることがありましたので解説させていただきます。 Contents1 JPAとは?1.1 メリット1. …

no image

スコープアノテーションとCDIについて

JavaEEで個人的に鬼門がCDIとスコープだと思っています。 ここが少しずつ分かりかけてきたんでメモします。 まずJavaEEでは変数の生存期間をアノテーションで定義します。 これがなかなか分かりに …

no image

Mapからインスタンス変数、インスタンス変数からMapへ

Javaで変数を引き回すときにMapからインスタンス、インスタンスからMap、あるインスタンスから別のインスタンスに変数を差し替える作業って結構多いと思います。 これって普通にやるとMapのget,p …

no image

JavaEEのトランザクションに関して

最近あまり触れていないJavaEEのトランザクションについて。 JavaEEの場合、EJB環境では@Statelessを付けることによりトランザクション管理を行うことができます。 [crayon-5d …

no image

新アプリの本番環境デプロイについて

新しく作ったWEBアプリを本番配置しようとしたんですが、何度もやっているはずの処理がいざやろうとするといろいろと手間取ってしまい、1時間近くかかりました。 容量悪いなーと思いつつ、こういった行為はなる …