操作タイプの使用とJava 8ストリームでのピーク


操作タイプの使用とJava 8ストリームでのピーク

はじめに

ストリーム操作として、Java 8ストリームには、中間操作と終了操作の2つの操作タイプがあります。2つの違いは何ですか?

ピークの例を見てみましょう:

Stream<String> stream = Stream.of("one", "two", "three","four");
        stream.peek(System.out::println);

上記の例では、元々の目的はStreamの値を出力することでしたが、実際には出力はありません。

なんで?

中間操作と終了操作

Java 8ストリームは3つの部分で構成されています。データソース、ゼロまたは1つ以上の中間操作、1つまたはゼロの終了操作。

中間操作はデータの処理です。中間操作は遅延操作であり、すぐには開始されないことに注意してください。終了操作が実行されるのを待つ必要があります。

終了操作はストリームの開始操作であり、終了操作が追加された場合にのみ、ストリームは実際に実行を開始します。

したがって、問題は解決され、ピークは中間操作であるため、上記の例には出力がありません。

ピーク

ピークのドキュメントを見てみましょう。ピークは主にデバッグ目的で使用されます。

デバッグ目的の使用を見てみましょう:

Stream.of("one", "two", "three","four").filter(e -> e.length() > 3)
                .peek(e -> System.out.println("Filtered value: " + e))
                .map(String::toUpperCase)
                .peek(e -> System.out.println("Mapped value: " + e))
                .collect(Collectors.toList());

上記の出力例:

Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

上記の例では、streamの中間値を出力しています。これは、デバッグに便利です。

なぜそれをデバッグとしてのみ使用するのですか?別の例を見てみましょう:

Stream.of("one", "two", "three","four").peek(u -> u.toUpperCase())
                .forEach(System.out::println);

上記の例では、peekを使用して要素を大文字に変換しています。次に出力します:

one
two
three
four

ストリームの要素が大文字に変換されていないことがわかるので、ピークはデバッグにのみ使用されます。

マップの比較を見てください:

Stream.of("one", "two", "three","four").map(u -> u.toUpperCase())
                .forEach(System.out::println);

出力:

ONE
TWO
THREE
FOUR

マップが要素の真の変換であることがわかります。

もちろん、ピークには例外があります。ストリームにオブジェクトがある場合はどうなりますか?

    @Data
    @AllArgsConstructor
    static class User{
        private String name;
    }
        List<User> userList=Stream.of(new User("a"),new User("b"),new User("c")).peek(u->u.setName("kkk")).collect(Collectors.toList());
        log.info("{}",userList);

出力結果:

10:25:59.784 [main] INFO com.flydean.PeekUsage - [PeekUsage.User(name=kkk), PeekUsage.User(name=kkk), PeekUsage.User(name=kkk)]

オブジェクトの場合、実際の結果は変更されることがわかります。

おわりに

この記事では、ストリームの2つの操作タイプについて説明し、ピークの使用方法をまとめました。マスターしていただければ幸いです。

この記事の例https://github.com/ddean2009/learn-java-streams/tree/master/stream-peek

私の公開番号に注意を払うことを歓迎します:プログラムのそれらのこと、あなたをもっとエキサイティングに待っています!
詳細については、www.flydean.comをご覧ください

元の記事を172件公開 241 件を獲得 48万件以上

おすすめ

転載: blog.csdn.net/superfjj/article/details/105698527