Mengembalikan daftar default jika daftar kosong menggunakan java 8 Streams?


9

Apakah ada cara sehingga hal-hal di bawah ini dapat dilakukan sebagai satu set operasi aliran, bukannya memeriksa secara eksplisit apakah recommendedProducts kosong lalu mengembalikan daftar default yang lain mengembalikan daftar yang difilter ?

public List<Product> getRecommendedProducts() {
    List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.toList());

    if (recommendedProducts.isEmpty()) {
        return DEFAULT_PRODUCTS;
    }

    return recommededProducts;
}

4
Apa yang salah dengan kode Anda yang ada?
Andy Turner

@AndyTurner Setuju. Kodenya bagus. Satu-satunya peningkatan yang akan saya lakukan adalah menggunakan operator ternary alih-alih pernyataan if-else . Ini masih masalah selera.
ETO

@ETO Tidak ada yang salah, tapi saya mencoba / berharap untuk mencari tahu apakah ada cara untuk melakukannya hanya dengan menggunakan API Stream tanpa pemeriksaan kondisi eksplisit. Terima kasih atas jawabannya - Saya suka saran operator ternary.
user3495691

Jawaban:


5

Anda dapat mencoba ini:

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));

5

Meskipun Anda dapat mencapai tujuan Anda menggunakan Optional , saya masih akan memilih operator ternary tua biasa.

Dalam kasus khusus ini jauh lebih masuk akal dan meningkatkan keterbacaan:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

Ya dengan menggunakan Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.