こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在4社経験している、11年目エンジニアです。
この記事では、 JavaのStream APIについて
- Stream APIとは
- Stream APIの処理の流れ
- Stream APIを使った場合と使わなかった場合の比較
と、この記事で丁寧に解説していきます。
前提条件:実行環境について
実行環境は以下の通りです。
OS | Windows10 |
---|---|
IntelliJ IDEAのエディション | Community(無料版) |
IntelliJ IDEAのバージョン | 2021.3.2 |
プロジェクト | Javaプロジェクト |
SDK | Oracle OpenJDK version17.0.2 |
Javaを動かすためにIntelliJ IDEAを使っています。
IntelliJ IDEAのインストールは、下の記事をご参考ください。
解説で使うJavaプログラムは、Sampleプロジェクトのsampleパッケージ内にある、とします。
Stream APIとは
Stream APIとは、
- コレクション(ArrayListなど)
- 配列
- ファイル
の繰り返し処理を簡単に扱うことができるAPIです。
Java SE8から追加されました。
Stream APIを使ったサンプルプログラムは以下です。
これはArrayListの要素に対して文字数が偶数の要素のみ抽出し、出力するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package sample; import java.util.ArrayList; import java.util.Arrays; public class Sample { public static void main(String[] args) { ArrayList<String> fruitList = new ArrayList(Arrays.asList("apple", "orange", "peach", "strawberry")); fruitList.stream() .filter(fruit -> fruit.length() % 2 == 0) .forEach(fruit -> System.out.println(fruit)); } } |
実行結果は、以下になります。
1 2 |
orange strawberry |
ArrayListの要素で、文字数が偶数のもののみ出力できていることが確認できました。
次の章では、Stream APIの処理の流れについて解説します。
Stream APIの処理の流れ
Stream APIは
- Streamを生成
- 中間操作
- 終端操作
という処理の流れになります。
基本的にメソッドチェーンで続けて書きます。
図にすると以下です。
前章のサンプルプログラムだと、以下にあたります。
それぞれについて解説していきます。
Streamを生成
最初にコレクションなどからStreamを生成します。
Streamを生成するメソッドでよく使われるであろうメソッドを以下の表にまとめました。
メソッド | 説明 |
---|---|
【コレクション】.stream() | コレクションからStreamを生成 |
Arrays.stream(【配列】) | 配列からStreamを生成 |
IntStream.range | int型の要素から成るIntStreamを生成 |
中間操作
個々の要素に対して加工・抽出などをする操作が中間操作です。
0から複数回行うことができます。
なので、中間操作は行わなくてもOKです。
中間操作でよく使われるであろうメソッドを以下の表にまとめました。
メソッド | 説明 |
---|---|
distinct | ストリーム内の重複している要素をすべて削除したストリームを返すメソッド |
filter | 指定された条件でtrueを返す要素のみを抽出することができるメソッド |
limit | 指定した数にストリームを切り詰めて返すメソッド |
map | 要素を加工するメソッド |
skip | 先頭から指定した数だけストリームの要素をスキップしたストリームを返すメソッド |
flatMap | Streamを引数にとり、何らかの処理をしてStreamを返すメソッド 多重ループに有効 |
終端操作
加工・抽出などをしたStreamに対して最終的な結果を出すのが終端操作です。
中間操作は行わなくても良いですが、終端操作は必ず末尾で1回だけ行う必要があります。
終端操作でよく使われるであろうメソッドを以下の表にまとめました。
メソッド | 説明 |
---|---|
forEach | Streamから要素を1つずつ取り出して処理を行うメソッド |
count | Streamの要素数を返すメソッド |
allMatch | Streamのすべての要素が指定する条件に合致するかを判定して結果を返すメソッド |
noneMatch | Streamのすべての要素が指定する条件に合致しないかを判定して結果を返すメソッド |
Stream APIを使った場合と使わなかった場合の比較
どの程度簡単にできるか?を実際に比較します。
「Stream APIとは」の章で使ったサンプルプログラムを引用します。
1 2 3 |
fruitList.stream() .filter(fruit -> fruit.length() % 2 == 0) .forEach(fruit -> System.out.println(fruit)); |
Stream APIを使わず書くと以下のようになります。
1 2 3 4 5 |
for(String fruit : fruitList) { if (fruit.length() % 2 == 0) { System.out.println(fruit); } } |
どちらも結果は同じですが、Stream APIを使った方が行数が少なくなりました。
可読性も上がっているためバグを生み出しにくくなったと思います。
まとめ:Stream APIを使ってみよう!
以上がJavaのStream APIについての解説でした!
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント