はじめに
先輩エンジニアの方から学んだ方がいいとアドバイスをもらいStream APIについてキャッチアップをしました。
なんだか難しく聞こえますが、使ってみると意外と簡単なので忘備録を兼ねまとめています。
Stream APIとは?
Java8で導入された配列やCollectionなどを扱い、値の集計やデータを使った処理などができる便利なAPIのこと。
これだけではあまりイメージが湧かないので、for文で記述していた処理をシンプルに記述できる便利機能と覚えておけばOK!
for文とStream APIの比較
今回は「1から5までの整数の中から偶数を取得する処理」をfor文とStream APIを利用して実装する。
import java.util.Arrays;
import java.util.List;
public class StreamTest {
public static void main(String[] args) {
// 1から5までの整数
List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
// for文を利用した処理
for (Integer num : numList) {
if (num % 2 == 0) {
System.out.println(num);
}
}
// Stream APIを利用した処理
numList.stream() // Streamを生成
.filter(i -> i % 2 == 0) // numListの中から該当する値のみを取得
.forEach(i -> System.out.println(i)); // 上記で該当した値のみを出力する
}
}
Stream APIを使うメリット
◎可読性の高いコードを実装できる
上記の実装の通り、for文ではどのような処理かぱっと見わからない。
一方、Stream APIを使った処理は、Streamが保持するメソッドで処理を宣言してから条件を記述しているため、どんな処理が行われるのか分かり易いというメリットがある。
また、コード量も減らすことができるのでリーダブルなコードにするのに適している。
その他にもメリットはあるようですが、自分が感じたメリットはこれだけだったので割愛します。。。
Stream APIの実装方法
1ステップ:Streamの生成
配列やListに対して**.stream()**でStreamを生成する。
Streamを生成することで、データの変換や加工が可能になる。
// 上記の例のnumListを参考にstreamを生成
numList.stream()
2ステップ:中間操作
1ステップ目で生成したStreamに対してデータの変換や加工を行う。
中間操作にはデータをの変換や加工を行うメソッドが複数用意されている。
中間操作は複数記述が可能。また、省略することもできる。
// 中間操作のメソッドを一部抜粋
// sortedメソッド
.sorted() // 昇順にする
.sorted(Comparator.reverseOrder()) // 降順にする
// filterメソッド
.filter(i -> i % 2 == 0) // 条件に合ったデータのみを取得する
// iは一時変数のためnumでも好きなものでOK
// limitメソッド
.limit(3) // 引数の値分データを取得する(今回の場合3つ分のデータを取得する)
3ステップ:終端操作
2ステップ目で加工した結果を操作する。
中間操作同様メソッドが複数用意されている。
終端操作は省略ができない。
// 終端操作のメソッドを一部抜粋
// forEachメソッド
.forEach(i -> System.out.println(i)); // 拡張for文同様、要素を繰り返し出力する
// collectメソッド
.collect(Collectors.toList()); // データを扱いやすいStreamの形に変換していたため、元のListに戻す
さいごに
Stream APIを実際に使ってみて、コード量を減らすだけでなく、ぱっと見てなんとなく理解できるコードを感動しました。
皆様の参考に少しでもなれたら嬉しいです。
参考
https://www.casleyconsulting.co.jp/blog/engineer/191/
https://qiita.com/takumi-n/items/369dd3fcb9ccb8fcfa44