前置き
最近は暑くて外出する気にもなりませんね...
田舎者の私は川までドライブして涼んでいます(*´Д`)
今回は前回に引き続き「StreamAPI」についてです。
###「StreamAPIってなに?」
コレクションを扱う時に要素を一つずつ取り出して、何らかの処理を加え、特定の要素だけを取り出したり、配列に変換したり、コレクションを詰め替えたりすることがよくあります。
StreamAPIではこれらの処理をメソッドとラムダ式で記述することでコードをより簡潔にできます。 --黒本解説より引用
「簡単に書けるってことは理解も簡単ってことよね!?」
StreamAPIでは取り出しった要素に加える処理のことを「中間操作」、
中間操作を終えた要素の集合に対して行う最終処理を「終端操作」と呼びます。
これらの操作は、StreamAPIの基本となる機能をまとめたjava.util.stream.Streamインターフェースに定義されており、次のような種類があります。 --黒本解説より引用
【中間操作の種類】
処理を行うメソッド | 概要 |
---|---|
distinct | 要素の重複を除いたストリームを戻す |
filter | 引数に指定した条件に一致する要素だけで構成されるストリームを戻す |
limit | ストリームの要素を指定された数に切り詰めた結果のストリームを戻す |
map | 指定された関数を要素に適用した結果のストリームを戻す |
peek | 新しい結果のストリームを生成し、指定された関数を適用して戻す |
skip | 引数で指定した最初のn個の要素を破棄し、残った要素で構成されるストリームを戻す |
sorted | このストリームの要素を自然順序に従ってソートした結果から構成されるストリームを戻す |
【終端操作の種類】
処理を行うメソッド | 概要 |
---|---|
allMatch | ストリーム内のすべての要素が条件に一致するかどうかを調べる |
anyMatch | ストリーム内のいずれかの要素が条件に一致するかどうかを調べる |
collect | ストリームの要素を持つコレクションを戻す |
count | ストリーム内の要素を数える |
findAny | ストリーム内に要素が残っているかどうかの結果を持つOptionalを戻す |
findFirst | ストリーム内の最初の要素を持ったOptionalを戻す |
forEach | ストリーム内の要素を使って繰り返し処理を実行する |
max | ストリーム内の最大の要素を戻す |
min | ストリーム内の最小の要素を戻す |
noneMatch | ストリーム内の要素で条件に一致するものがないかどうか調べる |
reduce | ストリーム内の要素を累積的に結合していくリダクション処理を実行する |
toArray | ストリームの要素を含む配列を戻す |
「ふむふむ...」
なんかいっぱいあるけど英語から推測して、大体の意味が分かれば問題は解けそう。
「Optionalについても前回で学んだので大体は理解してるぞ!」
前回を見ていない人はOptionalは
「メソッドの処理結果を扱い、処理結果の正常・異常に関わらず、同じ型で扱うことができる」
とだけ覚えればOKです。
使い方
class Main {
public static void main(String[] args) throws Exception {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream()
.filter(n -> n > 2) //2より大きいものを抽出→(3,4,5,6,7,8,9,10)
.limit(5) //要素数を5に切り詰める→(3,4,5,6,7)
.map(n -> "残ったものは" + n) //文字列を加える
.forEach(System.out::println); //出力
}
}
「なんだか簡単に書けるじゃん」