Bagaimana saya bisa melewati batas (nomor) panggilan dengan aliran ketika jumlahnya sama dengan 0?

19

Saya punya beberapa kode Java yang menyediakan objek dari items. Ini membatasi mereka berdasarkan pada maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

Ini berfungsi dengan baik, tetapi pertanyaannya adalah ini: Apakah ada cara untuk melompati batasan kapan maxNumber == 0?

Saya tahu saya bisa melakukan ini:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

Tapi mungkin ada cara yang lebih baik, apakah ada yang terlintas dalam pikiran Anda?

pengguna acak1
sumber

Jawaban:

15

Saya kira itu

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

akan melakukan trik, karena sangat tidak mungkin bahwa Anda akan menangani aliran dengan lebih dari 2 ^ 63-1 elemen ...

Setidaknya berhati-hatilah dengan aliran paralel pada ini ... Catatan dalam API API mengatakan:

Catatan API : Sementaralimit() umumnya operasi yang murah pada pipa aliran sekuensial, ini bisa sangat mahal pada pipa paralel yang dipesan, terutama untuk nilai-nilai besar ...

Jean-Baptiste Yunès
sumber
ya, itu berhasil, terima kasih!
randomuser1
20

Tidak, aliran pipa tidak memungkinkan untuk benar - benar melewati bagian mana pun dari pipa, jadi Anda terpaksa bekerja dengan logika kondisional di dalam langkah-langkah dan termasuklimit() selalu dalam jalur pipa, atau membangun aliran di bagian-bagian yang akan menjadi sedikit lebih terbaca (IMHO) daripada if / else dalam pertanyaan

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

Dalam kasus sederhana seperti di sini tidak ada banyak bedanya, tetapi Anda sering melihat dalam koleksi kode biasa melalui metode, dikonversi menjadi stream dan kemudian kembali ke koleksi. Dalam kasus seperti itu, mungkin merupakan ide yang lebih baik untuk bekerja dengan stream di beberapa bagian sampai Anda benar-benar perlu collect().

Kayaman
sumber