Stream API 終端操作のうちmin
max
findFirst
findAny
count
についてまとめました。
min:最小値を返す
min メソッドは最小値を返すメソッドで、比較を行う関数型インターフェースのComparator<T>
を引数にとります。戻り値はOptional<T>
であるため、値を取り出すにはget
やorElse
メソッドを使用します。空ストリームの場合はOptional.empty()
を返します。
List<Integer> list = Arrays.asList(200, 100, 300); Optional<Integer> s = list.stream().min(Comparator.naturalOrder()); System.out.println(s.get()); // 実行結果 100
max:最大値を返す
max メソッドは最大値を返すメソッドで、比較を行う関数型インターフェースのComparator<T>
を引数にとります。戻り値はOptional<T>
であるため、値を取り出すにはget
やorElse
メソッドを使用します。空ストリームの場合はOptional.empty()
を返します。
List<Integer> list = Arrays.asList(200, 100, 300); Optional<Integer> s = list.stream().max(Comparator.naturalOrder()); System.out.println(s.get()); // 実行結果 300
findFirst:先頭の値を返す
findFirst メソッドは Stream 内の先頭の要素を返します。findFirst は順序が関係するので、ストリームが検出順序を持たない場合は任意の要素が返されます。戻り値はOptional<T>
で、空ストリームの場合はOptional.empty()
を返します。
List<Integer> list = Arrays.asList(200, 100, 300); Optional<Integer> s = list.stream().findFirst(); System.out.println(s.get()); // 実行結果 200
findAny:任意の値を返す
findAny メソッドは Stream 内の任意の要素を返します。findFirst と違って同じストリームに対して呼び出すたびに、違う結果が返される可能性があります。戻り値はOptional<T>
で、空ストリームの場合はOptional.empty()
を返します。
List<Integer> list = Arrays.asList(200, 100, 300); Optional<Integer> s = list.stream().findAny(); System.out.println(s.get()); // 実行結果 200
count:要素数を返す
count メソッドは Stream の要素数を返します。戻り値はlong
型です。List#size
と違って要素数を求める場合は Stream の最後の要素までループが実行されるため、同じ感覚で使用しないほうがいいです。
List<Integer> list = Arrays.asList(200, 100, 300); long s = list.stream().count(); System.out.println(s); // 実行結果 3
空ストリームかどうかを判定する際にif (stream.count() != 0)
とするような場合は、if (stream.findAny().isPresent())
とする方が効率がいいみたいです。
関連記事
Java8のOptionalの使い方 - TASK NOTES
Java8のforEachを使った繰り返し処理について - TASK NOTES
Java8のStream APIの使い方(Streamの生成編)
Java8のStream APIの使い方(中間操作編① - filter, map)
Java8のStream APIの使い方(中間操作編② - flatMap, distinct, limit, skip)
Java8のStream APIの使い方(中間操作編③ - sorted, peek)
Java8のStream APIの使い方(終端操作編① - anyMatch, allMatch, noneMatch) - TASK NOTES