Strumienie przetwarzanie

Strumienie przetwarzanie
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Pytanie bo nie potrafię znaleźć jednoznacznej odpowiedzi. Mając stream:

Kopiuj
Arrays.stream(g).filter(i-> i%2==0).filter(i-> i%3==0).filter(i-> i%4==0).map(i -> wynik[i] = i).collect(Collectors.toList());

Będzie przetwarzany w taki sposób? "pętla" z filtrem 1 potem znowu "pętla" z filtrem 2 itd...
Czy stream to jakoś zlepi i wykona te operacje w jednej "pętli" ?

BC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 159
0

Każdy filtr osobno.

orchowskia
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielona Góra
  • Postów: 83
0

To jest jakby jedna pętla:

Kopiuj
       List<String> x = new ArrayList<>();
        x.add("a");
        x.add("b");
        x.stream().filter(a -> {
            System.out.println("not null: " + a);
            return a != null;
        }).filter(a -> {
            System.out.println("length: " + a.length() + " " + a);
            return a.length() > 0;
        }).toArray();
    }

wynik:

Kopiuj
not null: a
length: 1 a
not null: b
length: 1 b

W tym przypadku filter() jest operacją intemediate co jakby dodaje instrukcje do pętli. toArray() jest terminalny co oznacza że to już koniec pętli. Dodatkowo bez zdarzenia terminalnego pętla się nie uruchomi

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
0

Dodałbym jeszcze, że te 3 filtry mógłbyś zamienić w jeden: filter(i-> i%12==0)

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0
kixe52 napisał(a):

Dodałbym jeszcze, że te 3 filtry mógłbyś zamienić w jeden: filter(i-> i%12==0)

te 3 filtry to tylko żeby zobrazować o co mi chodzi ;)

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Pytam czy dzieje sie to jako jedna petla bo zrobiłem test z normalnym for i stream wyszedł duuuuzooo wolniejszy. Natomiast pararell stream tylko trochę wolniejszy od for.

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2787
1
darksead napisał(a):

Pytam czy dzieje sie to jako jedna petla bo zrobiłem test z normalnym for i stream wyszedł duuuuzooo wolniejszy. Natomiast pararell stream tylko trochę wolniejszy od for.

To normalne - streamy są pewnym overheadem, pewnym narzutem. Dzięki nim mamy czytelniejsze api, bardziej funkcyjne, jednak pod spodem i tak siedzą zwykłe pętle, tylko dodatkowo jeszcze obudowane, więc zawsze stream będzie wolniejszy od zwykłego fora. No może poza sytuacją, kiedy mamy baaardzo dużo danych, a przetwarzanie da się jakoś zrównoleglić, to wtedy parallel stream **może **będzie szybszy.

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 3573
0

Z parallel streamami może tez być problem jak używasz ich w różnych miejscach i wątkach - one używają domyślnego ForkJoinPool które jest wspólne dla wszystkich strumieni równoległych, no chyba że jakies haki

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.