Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ストリーム.forEach() / reduce() / count()
ストリームの終端操作として、全要素の反復処理に『forEach()』、要素を集約(畳み込み)するために『reduce()』、要素数のカウントに『count()』を使用します(Java 8+)。数値ストリームでは『sum()』『average()』なども使えます。
構文
// 全要素に処理を行います(終端操作)。 ストリーム.forEach(要素 -> 処理); // 要素を集約します(初期値, (累積値, 要素) -> 新しい累積値)。 ストリーム.reduce(初期値, (a, b) -> 処理); // 要素数を返します。 ストリーム.count(); // 数値ストリームの合計を返します。 intStream.sum(); // 数値ストリームの平均を返します(OptionalDouble)。 intStream.average();
メソッド一覧
| メソッド | 概要 |
|---|---|
| forEach(Consumer) | 全要素に対してラムダ式の処理を実行する終端操作です。戻り値はありません。 |
| reduce(T identity, BinaryOperator) | 初期値と二項演算子を使って要素を集約します。集約結果を返します。 |
| count() | ストリームの要素数を long 型で返します。 |
| sum() | IntStream・LongStream・DoubleStream の合計を返します。 |
| average() | IntStream などの平均を OptionalDouble 型で返します。 |
サンプルコード
import java.util.Arrays;
import java.util.List;
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// forEach で全要素を出力します。
numbers.stream()
.forEach(n -> System.out.println(n)); // 『1』〜『5』と出力されます。
// メソッド参照を使って簡潔に書くこともできます。
numbers.stream().forEach(System.out::println);
// reduce で合計を求めます(初期値 0、(合計, 要素) -> 合計+要素)。
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
System.out.println(sum); // 『15』と出力されます。
// reduce で最大値を求めます。
int max = numbers.stream()
.reduce(Integer.MIN_VALUE, (a, b) -> a > b ? a : b);
System.out.println(max); // 『5』と出力されます。
// count で要素数を確認します。
long count = numbers.stream()
.filter(n -> n % 2 == 0)
.count();
System.out.println(count); // 偶数の個数『2』が出力されます。
// mapToInt で数値ストリームに変換して sum・average を使います。
int total = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println(total); // 『15』と出力されます。
double avg = numbers.stream().mapToInt(Integer::intValue).average().orElse(0);
System.out.println(avg); // 『3.0』と出力されます。
概要
『forEach()』はコレクションの拡張 for 文に近い動作をしますが、ストリームの中間操作と組み合わせて使える点が特徴です。『forEach()』内でローカル変数を変更することはできません(実質的に final である必要があります)。
『reduce()』は汎用的な集約操作で、合計・積・最大値・文字列結合など様々な用途に使えます。ただし合計・最大値といった一般的な操作には IntStream の『sum()』『max()』などの専用メソッドを使う方が可読性が高くなります。
ストリームをコレクションに収集するには『collect() / toList()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。