Java 8 Stream findFirst () vs. findAny ()

1. Perkenalan

Java 8 Stream API memperkenalkan dua metode yang sering disalahpahami: findAny () dan findFirst () .

Dalam tutorial singkat ini, kita akan melihat perbedaan antara kedua metode ini dan kapan menggunakannya.

2. Menggunakan Stream.findAny ()

Seperti namanya, metode findAny () memungkinkan Anda menemukan elemen apa pun dari Stream . Gunakan saat Anda mencari elemen tanpa memperhatikan urutan pertemuan:

Metode ini mengembalikan instance Opsional yang kosong jika Stream kosong:

@Test public void createStream_whenFindAnyResultIsPresent_thenCorrect() { List list = Arrays.asList("A","B","C","D"); Optional result = list.stream().findAny(); assertTrue(result.isPresent()); assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D"))); }

Dalam operasi non-paralel, kemungkinan besar akan mengembalikan elemen pertama dalam Aliran, tetapi tidak ada jaminan untuk ini .

Untuk kinerja maksimum saat memproses operasi paralel, hasilnya tidak dapat ditentukan dengan andal:

@Test public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect()() { List list = Arrays.asList(1, 2, 3, 4, 5); Optional result = list .stream().parallel() .filter(num -> num < 4).findAny(); assertTrue(result.isPresent()); assertThat(result.get(), anyOf(is(1), is(2), is(3))); }

3. Menggunakan Stream.findFirst ()

Metode findFirst () menemukan elemen pertama dalam Stream. Tentunya, metode ini digunakan saat Anda secara khusus menginginkan elemen pertama dari suatu urutan.

Ketika tidak ada urutan pertemuan, ia mengembalikan elemen apa pun dari Stream . The java.util.streams dokumentasi paket mengatakan:

Aliran mungkin atau mungkin tidak memiliki urutan pertemuan yang ditentukan . Itu tergantung pada sumber dan operasi perantara.

Jenis pengembalian juga merupakan instance opsional yang kosong jika Stream juga kosong:

@Test public void createStream_whenFindFirstResultIsPresent_thenCorrect() { List list = Arrays.asList("A", "B", "C", "D"); Optional result = list.stream().findFirst(); assertTrue(result.isPresent()); assertThat(result.get(), is("A")); }

Perilaku metode findFirst tidak berubah dalam skenario paralel. Jika tatanan perjumpaan ada, itu akan selalu berperilaku deterministik.

4. Kesimpulan

Dalam tutorial ini, kita melihat metode findAny () dan findFirst () dari Java 8 Streams API. Metode findAny () mengembalikan elemen apa pun dari Stream sementara metode findFirst () mengembalikan elemen pertama dalam Stream .

Anda dapat menemukan kode sumber lengkap dan semua cuplikan kode untuk artikel ini di GitHub.