中間操作とは
取り出した要素に対して行う操作のことを指し、下記のようなメソッドが用意されている。今回はInteger型のListに対して、それぞれの中間操作を実施し出力されるStreamの中身を確認する。その際、終端操作のforEachを用いるがそれはご愛敬ということで。
メソッド名 | 概要 |
---|---|
distinct | 要素の重複を除いたストリームを戻す |
filter | 引数に指定した条件に一致する要素だけで構成されるストリームを戻す |
limit | ストリームの要素を、指定された数に切る詰めた結果のストリームを戻す |
map | 指定された関数を要素に適用した結果のストリームを戻す |
peek | 新しい結果のストリームを生成し、指定された関数を適用して戻す |
skip | 引数で指定した最初のn個の要素を破棄し、残った要素で構成されるストリームを戻す |
sorted | このストリームの要素を自然順序に従ってソートした結果から構成されるストリームを戻す |
中間操作を実装してみる
確認には「3, 2, 1, 1, 2, 3, 4」のInteger型のリストに対して行う。
distinct
「3, 2, 1, 1, 2, 3, 4」の重複分が削除され、「3, 2, 1, 4」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.distinct(inputList); } public static void distinct(List<Integer> list){ /* distinct */ System.out.println("=== distinct ==="); Stream<Integer> distinctStream = list.stream().distinct(); distinctStream.forEach(i -> System.out.println(i)); } }
実行結果
=== distinct ===
3
2
1
4
filter
「3, 2, 1, 1, 2, 3, 4」の3未満のみ残され(3以上の値が除外され)、「2, 1, 1, 2」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.filter(inputList); } public static void filter(List<Integer> list){ /* filter */ System.out.println("=== filter ==="); Stream<Integer> filterStream = list.stream().filter(i -> i < 3); filterStream.forEach(i -> System.out.println(i)); } }
実行結果
=== filter ===
2
1
1
2
limit
「3, 2, 1, 1, 2, 3, 4」の最初から3つのみ抜き出し、「3, 2, 1」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.limit(inputList); } public static void limit(List<Integer> list){ /* limit */ System.out.println("=== limit ==="); Stream<Integer> limitStream = list.stream().limit(3); limitStream.forEach(i -> System.out.println(i)); } }
実行結果
=== limit ===
3
2
1
map
「3, 2, 1, 1, 2, 3, 4」の値に1ずつ加算していき、「4, 3, 2, 2, 3, 4, 5」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.map(inputList); } public static void map(List<Integer> list){ /* map */ System.out.println("=== map ==="); Stream<Integer> mapStream = list.stream().map(i -> i+1); mapStream.forEach(i -> System.out.println(i)); } }
実行結果
=== map ===
4
3
2
2
3
4
5
peek
「3, 2, 1, 1, 2, 3, 4」の値+pekの文字列を追加したストリームを作成し、「3peek, 3, 2peek, 2, 1peek, 1, 1peek, 1, 2peek, 2, 3peek, 3, 4peek, 4」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.peek(inputList); } public static void peek(List<Integer> list){ /* peek */ System.out.println("=== peek ==="); Stream<Integer> peekStream = list.stream().peek(i -> System.out.println(i+"peek")); peekStream.forEach(i -> System.out.println(i)); } }
実行結果
=== peek ===
3peek
3
2peek
2
1peek
1
1peek
1
2peek
2
3peek
3
4peek
4
skip
「3, 2, 1, 1, 2, 3, 4」の最初の3個を破棄し、「1, 2, 3, 4」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.skip(inputList); } public static void skip(List<Integer> list){ /* skip */ System.out.println("=== skip ==="); Stream<Integer> skipStream = list.stream().skip(3); skipStream.forEach(i -> System.out.println(i)); } }
実行結果
=== skip ===
1
2
3
4
skip
「3, 2, 1, 1, 2, 3, 4」をソートし、「1, 1, 2, 2, 3, 3, 4」が出力されることが期待される。
public class Main { public static void main(String[] args) { List<Integer> inputList = List.of(3,2,1,1,2,3,4); Main.sorted(inputList); } public static void sorted(List<Integer> list){ /* sorted */ System.out.println("=== sorted ==="); Stream<Integer> sortedStream = list.stream().sorted(); sortedStream.forEach(i -> System.out.println(i)); } }
実行結果
=== sorted ===
1
1
2
2
3
3
4
まとめ
中間操作に関して実装して動かしてみたが、ストリームに対する理解があまりないように感じた。とりあえず当初の予定通りに学習しつつ、ストリームを色々と動かしてみながら理解を深める必要があると思う。 また、peek、map、filterの3つについては実際に行われる処理を引数として渡す必要があり、実際の挙動など注意して理解する必要がある。 まとめると下記の通り。
- Streamというクラスに対して理解を深める必要がある(何ができるか等)
- peek, map, filterは処理を引数として渡すため要注意