【Java Stream API 超入門】filterメソッドを使って、条件でコレクション要素をフィルタリングする方法

こんにちは。大城です。
 
このブログでは、Java SE 8で追加されたStream APIについて、プログラム初心者のときに苦労した自分が解説していきます。
 
今回は、Stream APIの基本的な使い方を、例を交えて説明します!

Stream APIとは?

Streamとは、Listなどのコレクションに対する操作をサポートするクラスです。
オブジェクトのListに対して、条件による絞り込みや合計値や平均値などの集計処理を行うメソッドが用意されています。
for文の処理に比べて、処理がわかりやすいようにコードを記述できるのが特徴です。

使い方

それではStream APIの使い方について解説していきます。
 
基本的な流れは次のとおりです。

  1. コレクションからStreamを取得
  2. Streamに対して、絞り込みや要素の変換などの中間処理を行う
  3. 変換したStreamに対して結果の取得など行う終端処理を行う

それぞれの処理について見ていきましょう。

Streamの取得

ここでは、「Tokyo」、「Chiba」、「Saitama」、「Kanagawa」、「Gunma」、「Tochigi」、「Ibaraki」、「Yamanashi」の8つの要素を持つ文字列のListを例に挙げてやってみます。
 
次のように記述し、CollectionのStreamを取得します。

List<String> list = Arrays.asList(
  "Tokyo",
  "Chiba",
  "Saitama",
  "Kanagawa",
  "Gunma",
  "Tochigi",
  "Ibaraki",
  "Yamanashi"
);

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

中間処理

続いて、絞り込みや要素の変換などの中間処理を行います。今回はは、絞り込みを行うStream.filter()メソッドを紹介します。
 
filterメソッドは、条件でフィルタリングした新しいStreamを返却します。今回は文字列の長さが6文字以上という条件でフィルタリングを行います。
 
次のサンプルをご覧ください。

Stream<String> stream2 = stream.filter(str -> str.length() >= 6);

 
さらに、ここではラムダ式というものを使っています。->の左に要素を受け取る引数を置き、右に条件式を記述します。
 
filterメソッドは、条件式を満たす要素のみの新しいStreamを返却します。これにより、文字数が6文字以上の要素だけからなるstream2が取得できます。

終端処理

最後に、結果の取得や表示などの終端処理を行います。

stream2.foreEach(str -> System.out.println(str));

 
Stream.foreEach()は、ストリームの要素全てに対して1つずつ処理を実施するメソッドです。filterメソッドと同じで、ラムダ式によって->の左に要素を受け取る引数、右に処理の内容を記述します。

for文との比較

上記と同じ処理をするfor文での記述と比較してみましょう。
拡張for文での記述

List<String> list = Arrays.asList(
  "Tokyo",
  "Chiba",
  "Saitama",
  "Kanagawa",
  "Gunma",
  "Tochigi",
  "Ibaraki",
  "Yamanashi"
);

for (String str : list) { // Listのすべての要素に対して処理を実施
	if (str.length() >= 6) { // 文字列長が6文字以上という条件を満たした場合のみ表示を行う
		System.out.println(str); 
	}
}

 
実行結果
Saitama
Kanagawa
Tochigi
Ibaraki
Yamanashi

 
Stream APIでの記述
List<String> list = Arrays.asList(
  "Tokyo",
  "Chiba",
  "Saitama",
  "Kanagawa",
  "Gunma",
  "Tochigi",
  "Ibaraki",
  "Yamanashi"
);
Stream stream = list.stream(); // Streamの取得
Stream stream2 = stream.filter(str -> str.length() >= 6); // 文字列長が6文字以上のものだけを集める中間処理
stream2.foreEach(str -> System.out.println(str)); // 集めた要素をすべて表示する終端処理

 
実行結果
Saitama
Kanagawa
Tochigi
Ibaraki
Yamanashi

 
for文が、すべての要素を1つずつ取り出し、条件を満たすか判定して満たすなら表示という処理となっているのに対し、Streamを用いた処理は条件を満たすものだけを集めて、集めたものをすべて表示するという処理になっています。

まとめ

いかがでしたでしょうか。
 
Streamを用いた処理のほうが、コレクションの操作が直感的にわかりやすいと思います。
 
Streamには他にも要素を変換するメソッドや、変換した内容をListとして取得するメソッドなどが用意されています。次回は要素の変換などの中間処理について紹介できればと思います。
 
それでは、また。
 
 
 
 
《関連記事》

記事をシェア
MOST VIEWED ARTICLES