Jak mogę pominąć limit (numer) połączenia ze strumieniem, gdy liczba jest równa 0?

19

Mam trochę kodu Java, który zapewnia obiekty z items. Ogranicza je na podstawie maxNumber:

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

Działa poprawnie, ale pytanie brzmi: Czy istnieje sposób na ominięcie ograniczenia, gdy maxNumber == 0?

Wiem, że mógłbym to zrobić:

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

Ale może jest lepszy sposób, czy coś ci przychodzi na myśl?

randomuser1
źródło

Odpowiedzi:

15

Przypuszczam, że

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

załatwi sprawę, ponieważ jest mało prawdopodobne, aby zmierzyć się ze strumieniem zawierającym ponad 2 ^ 63-1 elementów ...

Przynajmniej bądź ostrożny z równoległymi strumieniami na tym ... Uwaga w dokumentach API mówi:

Uwaga API : Chociaż limit()jest to ogólnie tania operacja na potokach sekwencyjnych, może być dość kosztowna na zamówionych równoległych potokach, szczególnie przy dużych wartościach maxSize ...

Jean-Baptiste Yunès
źródło
tak, to załatwiło sprawę, dzięki!
randomuser1
20

Nie, rurociąg strumień nie pozwala właściwie pominąć wokół żadnej części rurociągu, więc jesteś zmuszony do pracy albo warunkowego logiki wewnątrz schodach i w tym limit()zawsze w rurociągu lub budowy strumienia w częściach, które byłyby nieco bardziej czytelny (IMHO) niż pytanie / jeśli w pytaniu

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

W prostym przypadku, takim jak tutaj, nie robi to dużej różnicy, ale często widzisz, że zwykłe kolekcje kodu są przekazywane metodami, konwertowane na strumienie, a następnie z powrotem do kolekcji. W takich przypadkach lepszym pomysłem może być praca ze strumieniami w częściach, dopóki naprawdę nie będzie to konieczne collect().

Kayaman
źródło