Come posso saltare la chiamata limite (numero) con uno stream quando il numero è uguale a 0?


19

Ho del codice Java che fornisce oggetti da items. Li limita in base a maxNumber:

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

Funziona correttamente, ma la domanda è questa: c'è un modo per saltare il limite quando il maxNumber == 0?

So che potrei farlo:

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());
}

Ma forse c'è un modo migliore, ti viene in mente qualcosa?

Risposte:


15

Suppongo che

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

farà il trucco, poiché è altamente improbabile che tu possa affrontare un flusso con più di 2 ^ 63-1 elementi ...

Almeno stai attento con flussi paralleli su questo ... Una nota nei documenti API dice:

Nota API : Sebbene limit()sia generalmente un'operazione economica su pipeline a flusso sequenziale, può essere piuttosto costosa su pipeline parallele ordinate, specialmente per grandi valori di maxSize ...


sì, questo ha funzionato, grazie!
— randomuser1

20

No, la pipeline del flusso non consente di saltare effettivamente qualsiasi parte della pipeline, quindi sei costretto a lavorare con la logica condizionale all'interno dei passaggi e includendo limit()sempre la pipeline o costruendo il flusso in parti che sarebbero un po 'più leggibile (IMHO) di if / else nella domanda

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());

In un caso semplice come qui non fa molta differenza, ma spesso nelle normali raccolte di codici vengono passati metodi, convertiti in flussi e quindi nuovamente in raccolte. In questi casi potrebbe essere una buona idea lavorare con flussi in parti fino a quando non è veramente necessario collect().

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.