Java 8 Stream findFirst () vs. findAny ()

1. Pengenalan

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

Dalam tutorial ringkas ini, kita akan melihat perbezaan antara kedua kaedah ini dan kapan menggunakannya.

2. Menggunakan Stream.findAny ()

Seperti namanya, kaedah findAny () membolehkan anda mencari unsur dari Aliran . Gunakan ketika anda mencari elemen tanpa memperhatikan urutan pertemuan:

Kaedah mengembalikan contoh Pilihan yang kosong jika Aliran 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 yang tidak selari, kemungkinan besar akan mengembalikan elemen pertama dalam Aliran tetapi tidak ada jaminan untuk ini .

Untuk prestasi maksimum semasa memproses operasi selari hasilnya tidak dapat ditentukan dengan pasti:

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

Kaedah findFirst () menemui elemen pertama dalam Aliran. Jelas sekali, kaedah ini digunakan semasa anda secara khusus menginginkan elemen pertama dari urutan.

Apabila tidak ada pesanan perjumpaan, ia mengembalikan unsur dari Aliran . The java.util.streams dokumentasi pakej berkata:

Aliran mungkin atau mungkin tidak mempunyai urutan pertemuan yang ditentukan . Ia bergantung pada sumber dan operasi perantaraan.

Jenis pengembalian juga merupakan contoh Pilihan yang kosong jika Aliran 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")); }

Tingkah laku kaedah findFirst tidak berubah dalam senario selari. Sekiranya pesanan perjumpaan ada, ia akan selalu bersikap deterministik.

4. Kesimpulan

Dalam tutorial ini, kami melihat kaedah findAny () dan findFirst () dari Java 8 Streams API. Kaedah findAny () mengembalikan sebarang elemen dari Aliran sementara kaedah findFirst () mengembalikan elemen pertama dalam Aliran .

Anda boleh mendapatkan kod sumber lengkap dan semua coretan kod untuk artikel ini di GitHub.