.stream() java 8

0

Spotkałem się ostatnio z pytaniem czemu jak chcemy działać na stream ach to musimy na naszej dajmy na to liście wywołać 'stream()' i dopiero później przejść do właściwej części np, forEach/ map etc. Pytanie -> czemu na samej korelacji nie można od razu wywoływać tych metod co na streamach. forEcha/map etc. Nie mogę nigdzie znaleźć odpowiedzi. Słyszałem także o jakimś frameworku, który to umożliwia ale nie pamiętam nazwy.

1

korelacji

kolekcji...

A co do reszty to nie bardzo rozumiem pytanie. Chcesz wiedzieć czemu nie wrzucono wszystkich streamowych metod bezpośrednio do kolekcji? Po pierwsze byłoby to mocno nieeleganckie i łamało SRP, a po drugie, co ważniejsze, streamy są lazy. Operacje na elementach strumienia są wykonywane dopiero kiedy trzeba, kiedy masz jakąś terminalną operacje. Gdyby nie było Stream<T> i wszystkie te metody były upchane w Collection<T> to te .map() czy .filter() musiałyby zwracać faktyczne kolekcje, czyli tym samym ewaluować wszystko od razu.

Przy czym akurat .forEach() możesz wołać bezpośrednio na kolekcji bo to i tak operacja terminalna.

1

Nie wspominając o tym że:

  • na kolekcji oprócz stream() można zrobić pararellStream() co zrównolegli potencjalne operacje
  • można zrobić stream nie na podstawie kolekcji, np Stream.of().
  • streamy po funkcji terminującej (collect(), findFirst(), anyMatch()) jest w stanie "closed" i nie można na nim już nic zawołać.
1

Co do frameworka to być może chodziło Ci o bibliotekę vavr, tam można na liście (ofc z vavra) bezpośrednio robić map, filter itp.

3

Dlaczego tak zrobili? Bo Java ma już 25 lat i trudno wprowadzać nowe feature bez łamania starego api.
A może programiści Javy są głupsi (sam zawodowo programuję w Javie) i jakby kolekcje miały metody map/filter, ale działające zachłannie to nikt nie używał by leniwych wersji ze Streamów ? Bo np nikt by nie przeczytał dokumentacji. Wcale by mnie to nie zdziwiło

Jak wyglądają inne rozwiązania na JVM?

  • W Scali wybrali podejście, że słowo kluczowe lazy decyduje że operacja mą być odroczone (są leniwe) czy wykonać się natychmiast (są zachłanne)
  • W Kotlinie także dali wybór. Normalny map/filter wykonuje się zachłannie, a jak chcemy leniwie to trzeba przekonwertować kolekcję na Sequence (odpowiednik Stream z Javy)
  • W Vavrze mamy i klasę Lazy i leniwy Stream i zachłanne map/filter w normalnych kolekcjach, czyli ogólnie hulaj dusza piekła nie ma
  • W Clojurze kolekcje zawsze są leniwe, ale to Lisp i to w dodatku inspirowany Haskellem
  • W języku Eta, wszystko domyślnie jest leniwe, ale to już prawdziwy Haskell

1 użytkowników online, w tym zalogowanych: 0, gości: 1