Penambahan API Opsional Java 9

1. Ikhtisar

Pada artikel ini, kita akan melihat penambahan Java 9 ke API Opsional .

Selain modularitas, Java 9 juga menambahkan tiga metode yang sangat berguna untuk kelas Opsional .

2. atau () Method

Kadang-kadang, saat Opsional kami kosong, kami ingin menjalankan beberapa tindakan lain yang juga mengembalikan opsional.

Sebelum Java 9, kelas Opsional hanya memiliki metode orElse () dan orElseGet () tetapi keduanya perlu mengembalikan nilai yang tidak dibungkus.

Java 9 memperkenalkan metode atau () yang mengembalikan Opsional lain dengan malas jika Opsional kita kosong. Jika Opsional pertama kita memiliki nilai yang ditentukan, lambda yang diteruskan ke metode or () tidak akan dipanggil, dan nilai tidak akan dihitung dan dikembalikan:

@Test public void givenOptional_whenPresent_thenShouldTakeAValueFromIt() { //given String expected = "properValue"; Optional value = Optional.of(expected); Optional defaultValue = Optional.of("default"); //when Optional result = value.or(() -> defaultValue); //then assertThat(result.get()).isEqualTo(expected); }

Dalam kasus Opsional bei ng kosong, kembali hasilnya akan sama dengan defaultValue:

@Test public void givenOptional_whenEmpty_thenShouldTakeAValueFromOr() { // given String defaultString = "default"; Optional value = Optional.empty(); Optional defaultValue = Optional.of(defaultString); // when Optional result = value.or(() -> defaultValue); // then assertThat(result.get()).isEqualTo(defaultString); }

3. ifPresentOrElse () Method

Ketika kita memiliki sebuah instance Opsional , seringkali kita ingin mengeksekusi tindakan tertentu pada nilai dasarnya. Di sisi lain, jika Opsional adalah mengosongkan kita ingin login atau melacak fakta bahwa oleh incrementing beberapa metrik.

Metode ifPresentOrElse () dibuat persis untuk skenario seperti itu. Kita bisa melewati Konsumen yang akan dipanggil jika Opsional didefinisikan, dan Runnable yang akan dijalankan jika Opsional kosong.

Katakanlah kita memiliki Opsional yang ditentukan dan kita ingin menaikkan penghitung tertentu jika nilainya ada:

@Test public void givenOptional_whenPresent_thenShouldExecuteProperCallback() { // given Optional value = Optional.of("properValue"); AtomicInteger successCounter = new AtomicInteger(0); AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); // when value.ifPresentOrElse( v -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); // then assertThat(successCounter.get()).isEqualTo(1); assertThat(onEmptyOptionalCounter.get()).isEqualTo(0); }

Perhatikan, bahwa callback diteruskan karena argumen kedua tidak dijalankan.

Dalam kasus Opsional kosong , callback kedua dijalankan:

@Test public void givenOptional_whenNotPresent_thenShouldExecuteProperCallback() { // given Optional value = Optional.empty(); AtomicInteger successCounter = new AtomicInteger(0); AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); // when value.ifPresentOrElse( v -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); // then assertThat(successCounter.get()).isEqualTo(0); assertThat(onEmptyOptionalCounter.get()).isEqualTo(1); }

4. Aliran () Method

Metode terakhir, yang ditambahkan ke kelas Opsional di Java 9, adalah metode stream () .

Java memiliki API Stream yang sangat lancar dan elegan yang dapat beroperasi pada koleksi dan menggunakan banyak konsep pemrograman fungsional. Versi Java terbaru memperkenalkan metode stream () pada kelas Opsional yang memungkinkan kita memperlakukan instance Opsional sebagai Stream.

Katakanlah kita memiliki Opsional yang ditentukan dan kita memanggil metode stream () di atasnya. Ini akan membuat Stream dari satu elemen tempat kita dapat menggunakan semua metode yang tersedia di Stream API :

@Test public void givenOptionalOfSome_whenToStream_thenShouldTreatItAsOneElementStream() { // given Optional value = Optional.of("a"); // when List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); // then assertThat(collect).hasSameElementsAs(List.of("A")); }

Di sisi lain, jika Opsional tidak ada, memanggil metode stream () di atasnya akan membuat Stream kosong :

@Test public void givenOptionalOfNone_whenToStream_thenShouldTreatItAsZeroElementStream() { // given Optional value = Optional.empty(); // when List collect = value.stream() .map(String::toUpperCase) .collect(Collectors.toList()); // then assertThat(collect).isEmpty(); }

Kita sekarang dapat dengan cepat menyaring Streaming dari optionals.

Mengoperasikan pada Stream kosong tidak akan berpengaruh apa pun, tetapi berkat metode stream () sekarang kita dapat menghubungkan API Opsional dengan Stream API. Ini memungkinkan kami membuat kode yang lebih elegan dan lancar.

5. Kesimpulan

Dalam artikel singkat ini, kami melihat penambahan API Opsional Java 9 .

Kami melihat cara menggunakan metode atau () untuk mengembalikan Opsional jika sumber Opsional kosong. Kami menggunakan ifPresentOrElse () untuk mengeksekusi Konsumen jika nilainya ada dan jika tidak, jalankan callback lain.

Terakhir, kami melihat cara menghubungkan Opsional dengan Stream API menggunakan metode stream () .

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub - ini adalah proyek Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.