Java 8 Streams peek () API

1. Perkenalan

Java Stream API memperkenalkan kita pada alternatif yang kuat untuk memproses data.

Dalam tutorial singkat ini, kita akan fokus pada peek () , metode yang sering disalahpahami.

2. Contoh Cepat

Mari kita mengotori tangan kita dan mencoba menggunakan peek () . Kami memiliki aliran nama, dan kami ingin mencetaknya ke konsol.

Karena peek () mengharapkan Konsumen sebagai satu-satunya argumennya, sepertinya cocok, jadi mari kita coba:

Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); nameStream.peek(System.out::println);

Namun, potongan di atas tidak menghasilkan keluaran. Untuk memahami alasannya, mari kita lakukan penyegaran singkat tentang aspek siklus hidup streaming.

3. Operasi Menengah vs. Terminal

Ingat bahwa aliran memiliki tiga bagian: sumber data, nol atau lebih operasi perantara, dan nol atau satu operasi terminal.

Sumber menyediakan elemen ke pipa.

Operasi menengah mendapatkan elemen satu per satu dan memprosesnya. Semua operasi perantara malas, dan akibatnya, tidak ada operasi yang akan berpengaruh hingga pipeline mulai berfungsi.

Operasi terminal berarti akhir dari siklus hidup aliran. Yang terpenting untuk skenario kami, mereka memulai pekerjaan di dalam pipa .

4. peek () Penggunaan

Alasan peek () tidak berfungsi dalam contoh pertama kami adalah karena ini adalah operasi perantara dan kami tidak menerapkan operasi terminal ke pipeline. Alternatifnya, kita bisa menggunakan forEach () dengan argumen yang sama untuk mendapatkan perilaku yang diinginkan:

Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); nameStream.forEach(System.out::println);

Halaman Javadoc peek () mengatakan: " Metode ini ada terutama untuk mendukung debugging, di mana Anda ingin melihat elemen saat mereka mengalir melewati titik tertentu dalam pipeline ".

Mari pertimbangkan cuplikan ini dari halaman Javadoc yang sama:

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());

Ini menunjukkan, bagaimana kita mengamati elemen yang lolos dari setiap operasi.

Selain itu, peek () dapat berguna dalam skenario lain: ketika kita ingin mengubah keadaan bagian dalam sebuah elemen . Misalnya, kita ingin mengubah semua nama pengguna menjadi huruf kecil sebelum mencetaknya:

Stream userStream = Stream.of(new User("Alice"), new User("Bob"), new User("Chuck")); userStream.peek(u -> u.setName(u.getName().toLowerCase())) .forEach(System.out::println);

Alternatifnya, kita bisa menggunakan map () , tapi peek () lebih mudah karena kita tidak ingin mengganti elemen.

5. Kesimpulan

Dalam tutorial singkat ini, kami melihat ringkasan siklus hidup streaming untuk memahami cara kerja peek () . Kami juga melihat dua kasus penggunaan sehari-hari saat menggunakan peek () adalah opsi yang paling mudah.

Dan seperti biasa, contoh tersedia di GitHub.