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?

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 ...


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.