今回から複数回に分けてJavaの便利機能「Stream API」について紹介していきます。
まずStream APIとはなんぞや?から説明し、様々な中間操作や終端操作を紹介していく予定です。
Stream APIとは?
Java SE8から導入されたフレームワークで、コレクションや配列をより効率的に使いやすくするために拡張されたもの。
これによって、コードを簡潔に書き可読性を向上させたり、柔軟な操作を可能にしたりする。
Stream APIでは、コレクションの各要素を処理していく「Stream=流れ」をイメージして、コレクションをStreamという別の概念で扱う。
従来のコレクション操作とStream APIの比較
一例として、Stream APIを使ったコードと従来のコレクション操作を比べてみる。
★従来のコレクション操作の例
import java.util.Arrays;
import java.util.List;
public class Sample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
for(int i = 0; i < list.size(); i++) {
num = num * 2;
System.out.println(num);
}
}
}
★Stream APIを使った例
import java.util.Arrays;
import java.util.List;
public class Sample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
numbers.stream().map(num -> num*2).forEach(System.out::println);
}
}
上記の2つのコードでは、リスト内の1~9までの数字を2倍にして出力するというシンプルな操作を行っている。
従来のコレクション操作の例では、for文を用いてリスト内の各要素に対して2倍の処理を施している。
Stream APIの例では、2倍から出力までの操作を1文で完結させている。
出力結果は両方とも同じである。
シンプルな操作なので、明らかにStreamAPIが簡潔に書けているとまでは言えないが、複雑なコレクション操作の場合はStream APIの便利さがより際立つ。
Stream APIの利用場面
・コレクションや配列の全要素に対して同じ変換や加工を加えたい場合
例)リスト内の全要素に対して、2倍の処理を施したいとき、全要素を大文字に変換したい場合など
・コレクションや配列の全要素に対して、合計や平均など統計を取りたい場合
例)オブジェクト型の要素をもつリスト内の全要素に対して、金額を取り出し合計や平均を求めたい場合など
・コレクションや配列の要素に対して、条件によってグループ化をしたり条件にあったデータのみ抽出したりしたい場合
例)オブジェクト型の要素をもつリスト内の全要素に対して、同じ部門に属するメンバの情報を取得したい場 合など
上記のように、Stream APIの利用場面は、コレクションや配列の要素に対して加工を加えた結果を取得したい場合に用いることができる。
注意点
Stream APIは、for文やwhile文の繰り返し構文を置き換えるための構文ではない。
for文やwhile文では、breakやcontinueを使える。また、Stream APIのラムダ式からはローカル変数の変更はできない。(実質的final)
次回以降は、中間操作と終端操作について紹介していこうと思います!