Map vs. FlatMap

JSH

Re:Map vs. FlatMap
« Odpověď #15 kdy: 25. 09. 2016, 13:08:58 »
Popsal jsi totéž - pouze z jiného pohledu a mnohem složitěji.

Ne.
map není v tomhle kontextu (pokud nechceš vážně zamotat hlavu tazateli, co očividně začíná) žádná kolekce dvojic, je to funkce vyššího řádu. Podobně u flatmap.

To zní docela kategoricky. Jako kdyb sis byl svým tvrzením zcela jist.

Nechtěl bys ty své funkce vyššího řádu alespoň popsat srozumitelněji, aby to tazatel pochopil? Ty obrázky vypadají spíš jako můj popis datových struktur.
Funkce vyššího řádu je funkce, která jako parametr bere další funkci.

A v těch obrázcích to map a flatmap nejsou ty datové struktury. Map a flatmap jsou transformace jedné datové struktury na jinou. Tazatel explicitně psal o funkcionálním přístupu, takže předpokládám že v případě Javy nemyslel datový typy Map, ale metodu map datového typu Stream.


Re:Map vs. FlatMap
« Odpověď #16 kdy: 25. 09. 2016, 14:02:27 »
Trochu tápu ve funkcionálním přístupu, jaký je pls rozdíl mezi map a flatMap?

Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Když už ses rozhodnul se v tomhle bahnu rochnit: tu věc, co popisuješ, jako FlatMap vážně někdo používá v jiném kontextu než jako příklad zhůvězilosti?

Kit

Re:Map vs. FlatMap
« Odpověď #17 kdy: 25. 09. 2016, 14:22:36 »
Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Když už ses rozhodnul se v tomhle bahnu rochnit: tu věc, co popisuješ, jako FlatMap vážně někdo používá v jiném kontextu než jako příklad zhůvězilosti?

Posuď sám:
http://martinfowler.com/articles/collection-pipeline/flat-map.html

Re:Map vs. FlatMap
« Odpověď #18 kdy: 25. 09. 2016, 14:56:48 »
No vždyť říkám.

Kit

Re:Map vs. FlatMap
« Odpověď #19 kdy: 25. 09. 2016, 15:11:52 »
No vždyť říkám.

Chceš snad tvrdit, že Martin Fowler píše zhůvěřilosti?


Re:Map vs. FlatMap
« Odpověď #20 kdy: 25. 09. 2016, 15:19:20 »
Chci tvrdit, že píše o něčem úplně jiném než ty. Což bys pochopil, kdyby jsi ten jeho text přečetl a pochopil.

Flatmap u něj není žádná datová struktura ale úplně normální funkce vyššího řádu.

Kit

Re:Map vs. FlatMap
« Odpověď #21 kdy: 25. 09. 2016, 15:24:07 »
Chci tvrdit, že píše o něčem úplně jiném než ty. Což bys pochopil, kdyby jsi ten jeho text přečetl a pochopil.

Flatmap u něj není žádná datová struktura ale úplně normální funkce vyššího řádu.

... která vytváří datovou strukturu, kterou jsem popsal.

Re:Map vs. FlatMap
« Odpověď #22 kdy: 25. 09. 2016, 15:28:29 »
Ale houby, podívej se, co se stane, když má nějaký vstupní string lichý počet slov.

ded.kenedy

Re:Map vs. FlatMap
« Odpověď #23 kdy: 25. 09. 2016, 15:52:54 »
Zkusim odpovedet trochu srozumitelneji, nez si to tu tradicne zvrhne a nekteri si zacnou nadavat do lopat a podobne.

map a flatMap jsou funkce/procedury vyssiho radu, v tomto pripade ve smyslu, ze jako svuj argument maji proceduru.

Funkce/procedura map dela to, ze vezme kolekci (seznam, stream, apod.) a na kazdy jeji prvek aplikuje predanou proceduru a vrati novou kolekci (seznam, stream).

Kód: [Vybrat]
Stream
.of(1, 2, 3, 4, 5)
.map(x -> x + 1)
.forEach(x -> System.out.println(x));
==> 2, 3, 4, 5, 6

Stream
.of(new int[] {1, 2}, new int[]  {3, 4}, new int[] {5, 6, 7})
.map(x -> x.length)
.forEach(x -> System.out.println(x));
==> 2, 2, 3

V prvnim pripade jsou prvky kolekce skalarni hodnoty (cela cisla), v druhem pripade jsou prvky kolekce pole (int[]), ale po kazde pro jednu hodnotu ze vstupni kolekce  vytvori pomoci predane procedury prave jednu hodnotu novou.

V pripade flatMap je to slozitejsi, protoze pro kazdou hodnotu ze vstupni kolekce je vytvorena nova kolekce hodnot (ktera muze obsahovat libovolne mnozstvi hodnot, klidne i zadnou) a tyto kolekce jsou pak spojeny v kolekci jednu.
Kód: [Vybrat]
Stream
.of(new int[] {1, 2}, new int[]  {3, 4}, new int[] {5, 6, 7})
.flatMapToInt(x -> Arrays.stream(x).map(y -> y + 1))
.forEach(x -> System.out.println(x));

==> 2, 3, 4, 5, 6, 7, 8
Stream
.of(1, 2, 3, 4, 5)
.flatMap(x -> Collections.nCopies(x, x).stream())
.forEach(x -> System.out.println(x));
==> 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5


zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Map vs. FlatMap
« Odpověď #24 kdy: 25. 09. 2016, 16:02:26 »
Zkusim odpovedet trochu srozumitelneji, nez si to tu tradicne zvrhne a nekteri si zacnou nadavat do lopat a podobne.

map a flatMap jsou funkce/procedury vyssiho radu, v tomto pripade ve smyslu, ze jako svuj argument maji proceduru.

Funkce/procedura map dela to, ze vezme kolekci (seznam, stream, apod.) a na kazdy jeji prvek aplikuje predanou proceduru a vrati novou kolekci (seznam, stream).

Kód: [Vybrat]
Stream
.of(1, 2, 3, 4, 5)
.map(x -> x + 1)
.forEach(x -> System.out.println(x));
==> 2, 3, 4, 5, 6

Stream
.of(new int[] {1, 2}, new int[]  {3, 4}, new int[] {5, 6, 7})
.map(x -> x.length)
.forEach(x -> System.out.println(x));
==> 2, 2, 3

V prvnim pripade jsou prvky kolekce skalarni hodnoty (cela cisla), v druhem pripade jsou prvky kolekce pole (int[]), ale po kazde pro jednu hodnotu ze vstupni kolekce  vytvori pomoci predane procedury prave jednu hodnotu novou.

V pripade flatMap je to slozitejsi, protoze pro kazdou hodnotu ze vstupni kolekce je vytvorena nova kolekce hodnot (ktera muze obsahovat libovolne mnozstvi hodnot, klidne i zadnou) a tyto kolekce jsou pak spojeny v kolekci jednu.
Kód: [Vybrat]
Stream
.of(new int[] {1, 2}, new int[]  {3, 4}, new int[] {5, 6, 7})
.flatMapToInt(x -> Arrays.stream(x).map(y -> y + 1))
.forEach(x -> System.out.println(x));

==> 2, 3, 4, 5, 6, 7, 8
Stream
.of(1, 2, 3, 4, 5)
.flatMap(x -> Collections.nCopies(x, x).stream())
.forEach(x -> System.out.println(x));
==> 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5
Ještě by asi bylo vhodné dodat, že nemusí jít jen o kolekce, ale že jde o hodně obecný koncept fungující i s Optional, Future apod.

Kit

Re:Map vs. FlatMap
« Odpověď #25 kdy: 25. 09. 2016, 16:05:30 »
Ale houby, podívej se, co se stane, když má nějaký vstupní string lichý počet slov.

Tohle je flattening seznamu seznamů na prostý seznam.

Flattening se však dá udělat i nad slovníkem, resp. i dalšími kolekcemi. Například tato učebnicová funkce v Lispu vytváří z prostého seznamu dvojice klíč=>hodnota.
Kód: [Vybrat]
(defun make-cd (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped ripped))

Podobným způsobem se předávají např. volitelné parametry funkcí.

Flatteningem vznikne seznam se strukturou na druhém řádku, tedy na střídačku klíč a hodnota. Takový seznam se pak dá například vypsat:
Kód: [Vybrat]
(format t "~{~a:~10t~a~%~}~%" cd)

gl

Re:Map vs. FlatMap
« Odpověď #26 kdy: 25. 09. 2016, 16:10:45 »
Trochu tápu ve funkcionálním přístupu, jaký je pls rozdíl mezi map a flatMap?

Map je kolekcí dvojic (klíč, hodnota).

FlatMap je jednoduchý seznam, ve kterém se střídají klíče a jejich hodnoty.

Když už ses rozhodnul se v tomhle bahnu rochnit: tu věc, co popisuješ, jako FlatMap vážně někdo používá v jiném kontextu než jako příklad zhůvězilosti?

V perlu je => jen alias pro ,.

Kód: [Vybrat]
%a = (1 => 2, 3 => 4)
@b = (1 => 2, 3 => 4)

je stejné co

Kód: [Vybrat]
%a = (1, 2, 3, 4)
@b = (1, 2, 3, 4)

ale nevím jestli se tomu říká flatmap.

Pokud přiřadím hashmapu do pole, dostanu to o čem píše Kit, jen nebude dodrženo pořadí klíčů.


Re:Map vs. FlatMap
« Odpověď #27 kdy: 25. 09. 2016, 16:15:08 »
Ale houby, podívej se, co se stane, když má nějaký vstupní string lichý počet slov.

Tohle je flattening seznamu seznamů na prostý seznam.

Flattening se však dá udělat i nad slovníkem, resp. i dalšími kolekcemi. Například tato učebnicová funkce v Lispu vytváří z prostého seznamu dvojice klíč=>hodnota.
Kód: [Vybrat]
(defun make-cd (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped ripped))

Podobným způsobem se předávají např. volitelné parametry funkcí.

Flatteningem vznikne seznam se strukturou na druhém řádku, tedy na střídačku klíč a hodnota. Takový seznam se pak dá například vypsat:
Kód: [Vybrat]
(format t "~{~a:~10t~a~%~}~%" cd)

Všimnul sis, že teď už říkáš něco úplně jiného, než byl ten nesmysl na začátku?

Kit

Re:Map vs. FlatMap
« Odpověď #28 kdy: 25. 09. 2016, 16:39:56 »
Všimnul sis, že teď už říkáš něco úplně jiného, než byl ten nesmysl na začátku?

Všiml sis, že hledám společnou řeč?

Flat není funkce, ale přídavné jméno s významem "plochý". FlatMap je doslovně "plochý slovník". Všimni si, že se tazatel ptal na FlatMap, nikoli na flatMap. Ptal se tedy na strukturu, nikoli na funkci, která by se spíš měla jmenovat "flatten", ovšem tento název má již jiná funkce.

Re:Map vs. FlatMap
« Odpověď #29 kdy: 25. 09. 2016, 16:43:46 »
Ne, nehledáme společnou řeč. Odpovídáme na dotaz - hodně lidí +- správně, ty špatně.

Doufejme, že si to tazatel přebere.