Java 9 Pilihan API Tambahan

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat penambahan Java 9 pada API Pilihan .

Di luar modulariti, Java 9 juga menambahkan tiga kaedah yang sangat berguna untuk kelas Pilihan .

2. atau () Menghubungi

Kadang-kadang, apabila kami Pilihan kosong, kami ingin melaksanakan beberapa tindakan lain yang juga mengembalikan O ptional.

Sebelum Java 9 kelas Pilihan hanya mempunyai kaedah orElse () dan orElseGet () tetapi kedua-duanya perlu mengembalikan nilai yang belum dibungkus.

Java 9 memperkenalkan kaedah atau () yang mengembalikan Pilihan lain dengan malas jika Pilihan kami kosong. Sekiranya Pilihan pertama kami mempunyai nilai yang ditentukan, lambda yang diteruskan ke kaedah atau () tidak akan dipanggil, dan nilai tidak akan dikira 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 hal Pilihan bei ng kosong, kembali hasil akan sama sebagai 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 () Menghubungi

Apabila kita mempunyai contoh Pilihan , seringkali kita ingin melakukan tindakan khusus pada nilai yang mendasarinya. Sebaliknya, jika pilihan adalah mengosongkan kita mahu log atau mengesan hakikat bahawa dengan menokok beberapa metrik.

Kaedah ifPresentOrElse () dibuat tepat untuk senario tersebut. Kita boleh lulus Pelanggan yang akan dipanggil jika Pilihan ditentukan, dan Dijalankan yang akan dijalankan jika Pilihan kosong.

Katakan bahawa kita mempunyai Pilihan yang ditentukan dan kami ingin menambah pembilang 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, bahawa panggilan balik berlalu sebagai argumen kedua tidak dilaksanakan.

Sekiranya Pilihan kosong , panggilan balik kedua dilaksanakan:

@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 () Menghubungi

Kaedah terakhir, yang ditambahkan ke kelas Pilihan di Java 9, adalah kaedah aliran () .

Java mempunyai API Aliran yang sangat lancar dan elegan yang dapat beroperasi pada koleksi dan menggunakan banyak konsep pengaturcaraan fungsional. Versi Java terbaru memperkenalkan kaedah aliran () pada kelas Pilihan yang membolehkan kami memperlakukan contoh Pilihan sebagai Aliran.

Katakan bahawa kita mempunyai Pilihan yang ditentukan dan kita memanggil kaedah aliran () di atasnya. Ini akan membuat Aliran satu elemen di mana kita dapat menggunakan semua kaedah 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")); }

Sebaliknya, jika Pilihan tidak ada, memanggil kaedah aliran () di atasnya akan membuat Aliran 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(); }

Kami kini boleh dengan cepat menapis Streams of Optionals.

Beroperasi pada Aliran kosong tidak akan memberi kesan apa pun, tetapi berkat kaedah aliran (), kita kini dapat mengaitkan API Pilihan dengan API Aliran . Ini membolehkan kita membuat kod yang lebih elegan dan fasih.

5. Kesimpulan

Dalam artikel ringkas ini, kami melihat penambahan API Pilihan 9 Java .

Kami melihat bagaimana menggunakan kaedah atau () untuk mengembalikan Pilihan sekiranya berlaku sekiranya sumber Pilihan kosong. Kami menggunakan ifPresentOrElse () untuk melaksanakan Pengguna sekiranya nilainya ada dan sebaliknya, jalankan panggilan balik yang lain.

Akhirnya, kami melihat cara mengaitkan Pilihan dengan API Aliran menggunakan kaedah aliran () .

Pelaksanaan semua contoh dan coretan kod ini terdapat dalam projek GitHub - ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.