.stream() java 8

.stream() java 8
AS
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 23 godziny
  • Postów:18
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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
PU
Kolekcje vavrowe mają operacje map, filter, reduce itd przez co wygodnie się z nimi pracuje, a jak programista chce mieć lazy to może zrobić .stream(), dużo lepsze rozwiązanie
Shalom
No nie wiem. Moim zdaniem koszt zawołania sobie .stream() jest znikomy, a szansa że ktoś błędnie będzie robił eager ewaluacje bezpośrednio na kolekcji jest spora. Ba, zgaduje że pewnie > 75% programistów nawet nie pomyśli o tym że te map czy filter na vavrowej kolekcji są eager ;]
PU
Idąc dalej > 75% programistów przy użyciu strumieni zawsze wywołuje na końcu operację terminującą (w jednym ciągu). Pytanie czy jak wiem, że będę potrzebował wyniku od razu to czy jest logiczny sens robienia strumienia (bo i po co?)?
Shalom
Oczywiście że jest! Bo zrobienie .map().map().map().collect() traversuje strumień raz robiąc f(g(h(x))) a robienie tego na kolekcji trawersuje wszystko tyle razy ile masz tych map po drodze, aplikując funkcje po jednej.
PU
Masz rację, z tyłu głowy miałem jedno z częstszych użyć streamów jako mapowanie DTO <> inny obiekt
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
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ć.
edytowany 1x, ostatnio: Riddle
RewAnd
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:36
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.

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 5x, ostatnio: KamilAdam
jarekr000000
Z tą scalą i lazy to niezrozumiale dla mnie piszesz. lazy w scali znam tylko jako lazy val, a jeśli chodzi o standardowe kolekcje, to jest jak w vavr, większość eager, ale są leniwe widoki - czyli jak Stream.
KamilAdam
Przepraszam że niezrozumiale piszę. W podlinkowanym artykule napisali lazy val output2 = geeks.map(l=> l*2) i nazwali to lazy evaluation dla kolekcji. Oczywiście nieskończonego streama się tak nie zrobi. W zasadzie jak na to patrze po przespanej nocy to to duże go sensu nie ma :P
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)