操作タイプの使用と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をご覧ください。