Categories: Java

【Java入門】Stream処理の処理順序とデバッグ方法(peekメソッドの使い方)

この記事では、ストリーム操作における処理の流れと、peek()を用いたデバッグ方法について説明します。

ストリーム操作の正しい処理イメージと誤った処理イメージ

注意

ストリーム操作の処理イメージは基本的には以下の流れになりますが、sorted()など並び替える中間操作を挟むとこのとおりに行かない場合があるので注意です。

ストリーム操作の正しい処理イメージ

for(String str:list){
    method1(str);
    method2(str);
    method3(str);
}

ストリーム操作の誤った処理イメージ

for(String str:list){

    method1(str);
}

for(String str:list){

    method2(str);
}

for(String str:list){

    method3(str);
}

デバッグ方法

ストリーム操作の途中経過を知りたい、つまりデバッグしたいときはpeek()を用いると何が起こっているのかを可視化することができます。

Java

public static void main(String[] args) {
    Arrays.asList(1,2,3).stream()
        .map(x -> x * 2)
        .peek(x -> System.out.println("peek文による出力1 :" + x))
        .map(x -> x * 4)
        .peek(x -> System.out.println("peek文による出力2 :" + x))
        .sorted()
        .forEach(x -> System.out.println("forEach文による出力:" + x));
}
【実行結果】
peek文による出力1 :2
peek文による出力2 :8
peek文による出力1 :4
peek文による出力2 :16
peek文による出力1 :6
peek文による出力2 :24
forEach文による出力:8
forEach文による出力:16
forEach文による出力:24

上記の例ではsorted()までの処理は要素が1個ずつ順番に流れてきて、sorted()が実行されるとになると、全部の要素が流れてきた後で、並び替えをして出力していることがわかります。
試しに、sortedしない例が以下。

Java

public static void main(String[] args) {
    Arrays.asList(1,2,3).stream()
        .map(x -> x * 2)
        .peek(x -> System.out.println("peek文による出力1 :" + x))
        .map(x -> x * 4)
        .peek(x -> System.out.println("peek文による出力2 :" + x))
        .forEach(x -> System.out.println("forEach文による出力:" + x));
}
【実行結果】
peek文による出力1 :2
peek文による出力2 :8
forEach文による出力:8
peek文による出力1 :4
peek文による出力2 :16
forEach文による出力:16
peek文による出力1 :6
peek文による出力2 :24
forEach文による出力:24

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

issiki_wp