【java8】まだfor文使ってるの?それstreamでできるよ

java

javaのfor文やwhile文でしかできなかったループ処理が、streamの登場によってループ処理が1行でできるようになりました。

streamを使えば単純なループから絞り込みやソートといった多少複雑な処理も1行でできるようになっています。今回はよく使いそうな処理をまとめて紹介していきます!

[スポンサーリンク]

もくじ

こちらすべてリスト(List)をstreamで処理する方法です。
値を全て表示する
フィルターで特定の値のみを表示する
最小値のみを表示する
最大値のみを表示する
1つでも条件を満たすかどうかを判定する
全ての条件を満たすかどうかを判定する
リストの先頭の値を取得する
昇順ソート
降順ソート

値(リスト内)を全て表示する。

こちらはstreamの一番初歩的な文法です。
リストの中身を全部表示させているだけの簡単なロジックです。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        list.stream()
            .forEach(s -> System.out.println("[" + s + "]"));
>実行結果
[1]
[2]
[3]

フィルターで特定の値のみを表示する。

リストの中身を条件で絞って表示する方法です。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        list.stream()
            .filter(s -> s > 1)
            .forEach(s -> System.out.println("[" + s + "]"));
>実行結果
[2]
[3]

最小値のみを表示する。

リストの中の最小値を表示します。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        Optional<Integer> min = list.stream()
                                    .min((a, b) -> a.compareTo(b));
        System.out.println("min : " + min.get());
>実行結果
min : 1

最大値のみを表示する。

リストの中の最大値を表示します。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        Optional<Integer> max = list.stream()
                                    .max((a, b) -> a.compareTo(b));
        System.out.println("max : " + max.get());

>実行結果
max : 3

1つでも条件を満たすかどうかを判定する

リストの中で1つでも条件を満たせばtrueを返します。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        boolean anyMatch = list.stream()
                .anyMatch(s -> s >= 2);
        System.out.println("anyMatch : " + anyMatch);
>実行結果
anyMatch : true

全ての条件を満たすかどうかを判定する

リストの中で全ての条件を満たせばtrueを返します。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        boolean allMatch = list.stream()
                .allMatch(s -> s > 0);
        System.out.println("allMatch : " + allMatch);
>実行結果
allMatch : true

リストの先頭の値を取得する

リストの先頭のみを取得します。
取得時のクラスはOptionalになりますので気をつけてください。

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        Optional<Integer> findFirst = list.stream()
                .findFirst();
        System.out.println("findFirst : " + findFirst.get());
>実行結果
findFirst : 1

昇順ソート

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        Stream<Integer> sort = list.stream()
                .sorted();
        sort.forEach(i -> System.out.println("["+i+"]"));
>実行結果
[1]
[2]
[3]

降順ソート

        List<Integer> list = new ArrayList<>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));

        Stream<Integer> sort2 = list.stream()
                .sorted((a, b) -> b.compareTo(a));
        sort2.forEach(i -> System.out.println("["+i+"]"));
>実行結果
[3]
[2]
[1]

最後に

いかがでしたでしょうか。streamを使ったほうがfor文をつかったロジックよりもシンプルなロジックになったと思います。

特にソートに関しては、今まで匿名クラスを作ったりして対応していましたがだいぶシンプルになりました。

java8になってもう2年を迎えようとしています。streamはけっして特殊な方法ではないのでガンガン使っていきましょう!

それでは!