Java 8 Akışı kullanılarak liste boşsa varsayılan liste döndürülüyor mu?


9

Aşağıdakilerin tek bir akış işlemi kümesi olarak gerçekleştirilebilmesi için herhangi bir yol var mı, önerilenProducts'ın boş olup olmadığını açıkça kontrol etmek yerine varsayılan listeyi döndürün yoksa filtrelenmiş listeyi döndürün ?

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

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

    return recommededProducts;
}

4
Mevcut kodunuzdaki sorun nedir?
Andy Turner

@AndyTurner Kabul Ediyorum. Kod olduğu gibi iyidir. Yapacağım tek gelişme if-else deyimi yerine üçlü operatör kullanmaktır . Yine de hala bir zevk meselesi.
ETO

@ETO Yanlış bir şey yok, ama ben sadece açık koşul kontrolleri ile Stream API'leri kullanarak bunu yapmanın bir yolu olup olmadığını öğrenmek için çalışıyordu / umuyordu. Cevabınız için teşekkürler - Üçlü operatör önerisini seviyorum.
user3495691

Yanıtlar:


5

Bunu deneyebilirsiniz:

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

5

Amacınızı kullanarak hedefinize ulaşabilirken, Optionalyine de eski üçlü üçlü operatörü tercih ederim.

Bu özel durumda çok daha mantıklı ve okunabilirliği artırır:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

Evet kullanarak Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.