Saya sedikit bingung antara Stream#findAny()
dan Stream#findFirst()
tentang Stream
API di Java 8.
Apa yang saya pahami adalah bahwa keduanya akan mengembalikan elemen pertama yang cocok dari aliran, misalnya, bila digunakan bersama dengan filter?
Jadi, mengapa dua metode untuk tugas yang sama? Apakah saya melewatkan sesuatu?
sumber
filter
diterapkan,findAny
dapat mengembalikan elemen apa pun, termasuk yang tidak cocok dengan filter yang diterapkan?findAny
dapat mengembalikan elemen apa pun dari itu dalam (semacam) acak, khususnya dalam operasi aliran paralelTidak, keduanya tidak akan mengembalikan elemen pertama Arus.
Dari
Stream.findAny()
(penekanan saya):Jadi sederhananya, mungkin atau mungkin tidak memilih elemen pertama dari Arus.
Dengan implementasi khusus Oracle saat ini, saya percaya bahwa itu akan mengembalikan elemen pertama dalam pipa non-paralel. Namun, dalam pipeline paralel, itu tidak selalu (dijalankan misalnya
System.out.println(IntStream.range(0, 100).parallel().findAny());
, dikembalikanOptionalInt[50]
saat saya menjalankannya). Bagaimanapun, Anda tidak boleh mengandalkan itu.sumber
findFirst mengembalikan elemen pertama aliran, tetapi findAny bebas memilih elemen apa pun di aliran.
List<String> lst1 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya"); List<String> lst2 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya"); Optional<String> findFirst = lst1.parallelStream().filter(s -> s.startsWith("D")).findFirst(); Optional<String> fidnAny = lst2.parallelStream().filter(s -> s.startsWith("J")).findAny(); System.out.println(findFirst.get()); //Always print David System.out.println(fidnAny.get()); //Print Jack/Jill/Julia :behavior of this operation is explicitly nondeterministic
sumber
dalam mode paralel urutan
findAny
tidak dijamin, tetapifindFirst
tidak.Saya menulis beberapa potongan kode untuk menunjukkan perbedaannya, kunjungi
sumber
Dalam aliran findFirst dan findAny mengembalikan elemen pertama dan tidak mengeksekusi sisanya tetapi dalam parallelStream, tidak diperbolehkan untuk mengatakan urutan dan parallelStream mengeksekusi sisa koleksi.
Referensi
Waktu 1:25:00
sumber
Saya hanya akan mengatakan bahwa waspadalah terhadap
findFirst()
DanfindAny()
saat menggunakan.Dari Javadoc mereka (di sini dan di sini ) kedua metode mengembalikan elemen arbitrer dari aliran - kecuali aliran memiliki urutan pertemuan , dalam hal ini
findFirst()
mengembalikan elemen pertama sementarafindAny()
akan mengembalikan elemen apa pun.Misalkan kita memiliki
list
nama ISBN dan BUKU yang terdiri dari custom . Untuk skenario, lihat contoh ini:public class Solution { private Integer ISBN; private String BookName; public Solution(int i, String string) { ISBN =i; BookName = string; } //getters and setters }
public static void main(String[] args) { List<Solution> Library = Arrays.asList(new Solution(12,"Java in Action"),new Solution(13,"Java 8"),new Solution(15,"Java 8 Features"),new Solution(16,"Java in Action")); System.out.println(Library.stream() .map(p->p.getBookName()) .sorted(Comparator.reverseOrder()) .findFirst()); }
Keluaran :
Optional[Java in Action]
Ada beberapa skenario ketika nama Buku sama tetapi nomor ISBN berbeda, dalam hal ini penyortiran dan pencarian buku bisa sangat mirip
findAny()
dan akan memberikan hasil yang salah. Pikirkan skenario di mana 5 buku diberi nama "Referensi Java" tetapi memiliki nomor ISBN yang berbeda danfindFirst()
buku berdasarkan nama akan menghasilkan sama sepertifindAny()
.Pikirkan skenario di mana:
ISBN Name Of book +-----+------------------+ | 100 | Java-8 in Action | +-----+------------------+ | 101 | Java-8 in Action | +-----+------------------+ | 102 | Java-8 in Action | +-----+------------------+ | 103 | Java-8 in Action | +-----+------------------+ | 104 | Java-8 in Action | +-----+------------------+
di sini findFirst () dan findAny () akan memberikan hasil yang sama meskipun diurutkan di BookByName.
Artikel Rinci:
sumber
Kapan
Stream
tidak berurutan,findFirst()
danfindAny()
sama. Tapi kalauStream
sudah dipesan,findAny()
akan lebih baik.sumber
Stream
makhluk yang "diperintahkan"? Itu selalu dipesan (operasi dijalankan pada yang diberikanStream
dalam urutan yang sama setiap kali tidak diparalelkan), tetapi mungkin tidak diurutkan oleh pengguna.