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.