テクニック

Streamの書き方と使い方!今後Javaで必須の技術になります。

stream,流れ

この記事を読んでいる人は次の2つのパターンの人が多いのではないでしょうか?

  • Streamって何だろう?
  • Streamの書き方はどうだっけ?

要するに、初めてStreamに触れる人と、Streamは知っているけど書き方を忘れた人です。

Streamに興味を持ってくれる、Streamを使おうとしているというのはとても大事な事です。

なぜなら、実はStreamを書けないプログラマは少なく無いからです。今後必須の技術になりますので、是非習得しましょう。

なぜStreamが必要なのか

そもそも、Streamを書けない人が多い最大の理由は、全てfor文で同じことができるからです。

特に多いのが、昔の書き方が染みついていて今更Streamに移行出来ない人です。

今までfor文で出来ていた事がStreamで記述すると何が嬉しいのかというと

コードを順序立てて書くことが出来るので、可読性が上がるということです。

見た目もスッキリするし、後から読んで処理の内容を理解するのに必要な時間が短縮されます。

可読性が上がるということは変更に強いソースコードになるということです。

Streamの書き方

Streamの書き方の大筋は次のようになります。

  1. 配列データから一つ取り出す
  2. 取り出したデータを加工する
  3. 加工したデータを操作する

例えば、for文で西暦を平成何年という和暦に変更する処理を考えます。

ただし、平成以外の和暦は削除します。

※1989年 = 平成1年です。

扱うデータは1988年~1990年の数値が入ったList型オブジェクトです。

// List型オブジェクトの宣言
List<Integer> yearList = new ArrayList<Integer>();  
list.add(1988);
list.add(1989);
list.add(1990);

この処理をfor文で実現すると次のようになります。

List<String> heiseiYearList = new ArrayList<String>();
for (Integer year : yearList) {
    if(1988 < year && year < 2020) {
        year -= 1988;
        heiseiYearList.add("平成" + year + "年");
    } 
}

処理のステップはこのようになっています。

  1. 配列から西暦を取り出す
  2. 1989年以上、2019年以下の西暦のみを対象にする
  3. 西暦から1988を引く(=平成の年を求める)
  4. 平成何年という文字列に変換する
  5. 配列に文字列を格納する

これをStreamで実現すると次のようになります。

List<String> heiseiYearList = new ArrayList<String>();
heiseiYearList = yearList.stream()                          // 1. 配列から西暦を取り出す
                         .filter(y -> 1988 < y && y < 2020) // 2. 1989年以上、2019年以下の西暦のみを対象にする 
                         .map(y -> y - 1988)                // 3. 西暦から1988を引く(=平成の年を求める)
                         .map(y -> "平成" + y + "年")        // 4. 平成何年という文字列に変換する
                         .collect(Collectors.toList());     // 5. 配列に文字列を格納する

簡単に解説すると、それぞれの処理は次のような意味を持ちます。

  • filterが条件に合うものだけをそれ以降も処理するという意味を持つフィルタリング処理
  • mapがデータを加工する処理
  • collect(Collectors.toList())が与えられたデータから配列を作成する処理

「y -> y – 1988」のような見慣れない書き方をしていますが、これはラムダ式と呼ばれる記述方法です。

説明すると長くなるので、ここでは説明しませんが

イメージとしては、配列から取り出した一つの値が”y”で、それに対して”y – 1988″の処理を行う、という風に理解してもらえるとよいと思います。

例ではわかりやすくするために、コメントと改行を入れていますが、本来なら一行で実現出来ています。

さらに、上で挙げた処理のステップが順番に実現出来ていることから、何がしたい処理なのかが明確で分かりやすい処理になります。

filterやmapなど、データのフィルタリングや加工を行うことを中間操作、加工したデータを最後に扱う操作を終端操作と呼びます。

ここで紹介しているもの以外にも、便利な中間操作や終端操作はたくさん存在します。

自分の実現したい処理に適したものを探して使いましょう。

まとめ

今まで、for文で書いていた処理をStreamで記述することで、処理を順序立ててスッキリ書くことが出来ることがわかりました。

最初は難しく感じてしまって、書くのがめんどくさいと思いますが、そこで諦めた結果、書けない人はたくさんいます。

これからもJavaを使う人はもちろん、この考え方は他の言語にも取り入れられて来ているので、今後必須の技術になります。

諦めずに、是非習得しましょう。

今回紹介したテクニックは、ソースコードの可読性を上げるテクニックの一つです。

これ以外にも、可読性を上げ、変更に強いソースコードにするためのテクニックはたくさんあります。

代表的な物をこちらで紹介しているので、併せて習得しましょう。

良いソースコードの書き方紹介!4つのポイントで自身のスキルと周りの評価がアップする方法!この記事では、ソースコードの記述テクニックをご紹介します。 プログラマとして、良いソースコードを記述するのに必須のテクニックです。...

COMMENT

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