Java Srteam APIの徹底解説!効果的な使い方と書き方について

アイキャッチ画像

はじめに

本記事はIT会社勤務の100名程の研修生を見てきた元Java研修講師が、SpringFrameworkの案件などで特によく使われる「Stream API」について特徴やなぜよく使われるのか解説していきます!!

Stream API

コレクションや配列などのデータの処理(繰り返し・絞り込み・変換・集計)を簡潔に書けるようにJava 8から導入されました。従来のfor文を使ったループ処理と比較して、より直観的に処理を書けるという特徴があります。

基本構成

Stream APIは大きく3つのステップに分かれます。

  1. Streamの生成

Streamの生成は、コレクションや配列の変数に対して「.stream()」をすることでStreamの生成ができます。最初の1度だけ行う処理になります。

“`java

List<String> list = Arrays.asList(“apple”,”banana”,”cherry”);

Stream<String> streamList = list.stream();

“`

上記のように、リストを用意して「.stream()」することによって、Streamの生成ができます。このあとの操作をするにはStreamにしないといけないので、その事前準備になります。

  1. 中間操作

中間操作は生成したStreamに対して行う具体的な処理を指します。データの変換や加工を行うメソッドが多数用意されています。例えば、「絞り込み(filter)」「並び替え(sorted)」「型変換(map)」など他にも多数存在します。しかし、この中間操作だけでは何も処理されません。つまり中間操作をしてもコレクションや配列の中身は何も変わっていません。例えば、sortを使って並び替えしたとしても、終端操作が実行されないと並び替えは行われていません。

“`java

List<String> list = Arrays.asList(“apple”,”banana”,”cherry”);

Stream<String> streamList = list.stream()

.sorted();

“`

上記のように書けば、昇順で並び替えられているように見えるかもしれませんが、終端操作がないのでまだ並び替えは完了していません。終端操作については次にご紹介します。

  1. 終端操作

終端操作はStreamの最後に行う操作で、ストリームの処理を実際に実行し結果を得るための処理。終端処理を呼ぶことで、中間操作にて呼ばれていた処理(filterやmapなど)を実行する。終端操作は一度だけ実行される。(Streamは使い捨てのため再利用は不可。)

“`java

List<String> list = Arrays.asList(“apple”,”banana”,”cherry”);

list.stream()

.sorted()

.forEach(System.out::println)

“`

先ほどの処理に終端操作を書き加えると、上記のようになります。上記では終端操作として「forEach」を用いています。役割としては中間操作で並び替え(昇順)を行ったリストの中身の出力になります。

その他にもStreamの操作を行った結果をリストで返す方法もあります。

“`java

List<String> list = Arrays.asList(“apple”,”banana”,”cherry”);

List<String> resultList = list.stream()

.filter(s -> s.length() > 5)

.map(String::toUpperCase)

     .collect(Collectors.toList()); 

“`

このようにStreamは、Streamの生成(一度だけ)をし中間操作を行い(複数回可)、最後に終端操作(一度だけ)を行い処理を実行させるという流れになります。

まとめ

以上のように、Stream APIはデータ処理をシンプルで直感的に記述できます。処理は大きく3つのステップに分かれて「なにをしたいのか」を明確に表現しながらデータの処理の流れをスマートに記述でき、従来のfor文に比べて読みやすく修正もしやすいコードを書くことができるのが最大の魅力です。