Restituzione dell'elenco predefinito se l'elenco è vuoto utilizzando java 8 Streams?


9

Esiste un modo per cui il seguito può essere eseguito come un insieme di operazioni di flusso, invece di verificare esplicitamente se il prodotto consigliato è vuoto, quindi restituire l'elenco predefinito altrimenti restituire l'elenco filtrato ?

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

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

    return recommededProducts;
}

4
Cosa c'è che non va nel tuo codice esistente?
Andy Turner,

@AndyTurner Accetto. Il codice è buono così com'è. L'unico miglioramento che vorrei fare è usare l' operatore ternario invece dell'istruzione if-else . È comunque una questione di gusti.
ETO,

@ETO Non c'è nulla di sbagliato, ma stavo provando / sperando di scoprire se c'è un modo per farlo semplicemente usando le API Stream senza controlli espliciti delle condizioni. Grazie per la risposta: mi piace il suggerimento dell'operatore ternario.
user3495691

Risposte:


5

Puoi provare questo:

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

5

Mentre potresti raggiungere il tuo obiettivo usando Optional, continuerei a optare per un semplice vecchio operatore ternario.

In questo caso particolare ha molto più senso e migliora la leggibilità:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

Sì usando Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.