社会人のメモ帳

忘れたくないことアレコレ

【第4週】第4章:中間操作のメソッドを実装してみる【Java Gold合格へ向けて】

PREV | LIST | NEXT

中間操作とは

取り出した要素に対して行う操作のことを指し、下記のようなメソッドが用意されている。今回は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は処理を引数として渡すため要注意