Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Nurlandroid

Nurlan’s personal website

Show menu Hide menu

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

My name is Nurlan Nabiyev. I am passionate Android developer. This is my personal website with my portfolio of apps, posts and etc.

Contacts

Phone: +7 705 575 4828

Π’Π½ΠΈΠΊΠ°Π΅ΠΌ Π² Map, FlatMap, SwitchMap, ConcatMap

БСгодня ΡƒΠ·Π½Π°Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΊΠ°ΠΊ Map, FlatMap, SwitchMap, ConcatMap.

1. Map()

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Map() ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт, ΠΈΠ·Π»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ Observable-ΠΎΠΌ, ΠΈ эмиттит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ элСмСнт. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ· Ρ‚Π°ΠΊΠΎΠ³ΠΎ количСства Map(), ΠΊΠ°ΠΊΠΎΠ΅ посчитаСм Π½ΡƒΠΆΠ½Ρ‹ΠΌ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΈ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ для Observer-a.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€

РассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Map(), Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ„Ρ„Π»Π°ΠΉΠ½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с эмитируСмыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. НапримСр, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΡ‚ сСрвСра, Π½ΠΎ это Π½Π΅ соотвСтствуСт Π½Π°ΡˆΠ΅ΠΌΡƒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ. Π’ этом случаС Map() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния эмитируСмых Π΄Π°Π½Π½Ρ‹Ρ….

2. FlatMap()

FlatMap() ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты ΠΏΡ€ΠΈ эмиссии, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ порядок исходящих элСмСнтов Π½Π΅ поддСрТиваСтся. ПолСзСн Ссли порядок выполнСния Π½Π΅ Π²Π°ΠΆΠ΅Π½, Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΅Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

3. ConcatMap()

ВСхничСски Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ с FlatMap() Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, мСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ эмиттируСмых Π΄Π°Π½Π½Ρ‹Ρ…. ConcatMap() ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ порядок эмиссии Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ исполнСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Observable. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ порядок выполнСния Π·Π°Π΄Π°Ρ‡. ΠŸΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ConcatMap() Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‡Π΅ΠΌ FlatMap().

4. SwithMap()

SwithMap() ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ отличаСтся ΠΎΡ‚ FlatMap() ΠΈ ConcatMap(). Он Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ послСдний. SwitchMap отписываСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ источника Observable всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ·Π»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π΅ΠΌ самым всСгда эмитит Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Observable.

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ поиска, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ отправляСт поисковый запрос Π½Π° сСрвСр ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π² поисковой строкС. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ быстро Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚ нСсколько символов. ΠŸΡ€ΠΈ Π½Π°Π±ΠΎΡ€Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½Π° сСрвСр запрос с Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ строкой Π½Π° ΠΎΠ΄ΠΈΠ½ символ. Благодаря SwitchMap() ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСднСго Π½Π°Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ запроса.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ map () ΠΈ flatMap () Π² Java 8?

Π’ Java 8, Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° Stream.map() ΠΈ Stream.flatMap() ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹?

Π­Ρ‚ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mapper flatMap для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, Stream.empty() Ссли ΠΎΠ½Π° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния, ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅, Stream.of(a, b, c) Ссли ΠΎΠ½Π° Ρ…ΠΎΡ‡Π΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Но, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, любой ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½.

Stream.flatMap Как ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π΅Π³ΠΎ названию, это сочСтаниС a map ΠΈ flat ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ сначала примСняСтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ своим элСмСнтам, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚Π΅ Π΅Π΅. Stream.map Ρ‚ΠΎΠ»ΡŒΠΊΠΎ примСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π±Π΅Π· выравнивания ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ привСсти 2 ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ зрСния:
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°Ρ€Ρ‚Ρƒ:

НичСго особСнного Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, a Function примСняСтся для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° String Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ flatMap :

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСдаСтся ΠΏΠΎΡ‚ΠΎΠΊ списка. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊ Ρ†Π΅Π»Ρ‹Ρ… чисСл!
Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ прСобразования (Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Ρ€Ρ‚Ρƒ), Ρ‚ΠΎ сначала ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ свСдСн ΠΊ Ρ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ (ΠΏΠΎΡ‚ΠΎΠΊ Ρ†Π΅Π»Ρ‹Ρ… чисСл).
Если flatMap ΡƒΠ΄Π°Π»Π΅Π½, Ρ‚ΠΎ возвращаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ошибка: ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ для Ρ‚ΠΈΠΏΠ° (ΠΎΠ²) Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° List, int.
НСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ + 1 ΠΊ списку Ρ†Π΅Π»Ρ‹Ρ… чисСл!

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ясноС прСдставлСниС,

ΠΊΠ°Ρ€Ρ‚Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ² плоской ΠΊΠ°Ρ€Ρ‚Ρ‹:

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова ΠΈΠ· списка, ΠΌΡ‹ сдСлаСм Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅.

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠ°Ρ вСрсия ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅

Когда ΠΌΡ‹ собираСм Π΄Π²Π° списка, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅

Π‘Π΅Π· плоской ΠΊΠ°Ρ€Ρ‚Ρ‹ => [1,2], [1,1] => [[1,2], [1,1]] Π—Π΄Π΅ΡΡŒ Π΄Π²Π° списка Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ списка, поэтому Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ список, содСрТащий списки

Π‘ плоской ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ => [1,2], [1,1] => [1,2,1,1] Π—Π΄Π΅ΡΡŒ Π΄Π²Π° списка ΡΠ³Π»Π°ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈ Π² список ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, поэтому Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ список, содСрТащий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнты

Π’ основном это ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΎΠ΄ΠΈΠ½

Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ лямбда, пСрСданная ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΊΠ°Ρ€Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив String для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова, поэтому ΠΏΠΎΡ‚ΠΎΠΊ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΊΠ°Ρ€Ρ‚Ρ‹, Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Stream, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Stream для прСдставлСния ΠΏΠΎΡ‚ΠΎΠΊΠ° символов, Π½ΠΈΠΆΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Рисунок А:

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatmap,
Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ map ΠΈ Arrays.stream. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π²Π°ΠΌ понадобится ΠΏΠΎΡ‚ΠΎΠΊ символов вмСсто ΠΏΠΎΡ‚ΠΎΠΊΠ° массивов. БущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Arrays.stream (), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ массив ΠΈ создаСт ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’Ρ‹ΡˆΠ΅ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Ρ‚ΠΎΡ‡Π½Π΅Π΅, Stream>). ВмСсто этого ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ слово Π² массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΡƒΠΊΠ², Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatMap, ΠΌΡ‹ смоТСм Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

flatMap Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сопоставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива Π½Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° с содСрТимым этого ΠΏΠΎΡ‚ΠΎΠΊΠ°. ВсС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ использовании map (Arrays :: stream), ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. На рисункС B ΠΏΠΎΠΊΠ°Π·Π°Π½ эффСкт использования ΠΌΠ΅Ρ‚ΠΎΠ΄Π° flatMap. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ‚Π° Π½Π° рисункС A. Рисунок B Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

ΠœΠ΅Ρ‚ΠΎΠ΄ flatMap позволяСт Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС созданныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

What’s the difference between map() and flatMap() methods in Java 8?

In Java 8, what’s the difference between Stream.map() and Stream.flatMap() methods?

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

19 Answers 19

This is reflected in the arguments to each operation.

The flatMap operation takes a function that conceptually wants to consume one value and produce an arbitrary number of values. However, in Java, it’s cumbersome for a method to return an arbitrary number of values, since methods can return only zero or one value. One could imagine an API where the mapper function for flatMap takes a value and returns an array or a List of values, which are then sent to the output. Given that this is the streams library, a particularly apt way to represent an arbitrary number of return values is for the mapper function itself to return a stream! The values from the stream returned by the mapper are drained from the stream and are passed to the output stream. The «clumps» of values returned by each call to the mapper function are not distinguished at all in the output stream, thus the output is said to have been «flattened.»

Typical use is for the mapper function of flatMap to return Stream.empty() if it wants to send zero values, or something like Stream.of(a, b, c) if it wants to return several values. But of course any stream can be returned.

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

I would like to give 2 examples to get a more practical point of view:
First example making usage of map :

Nothing special in the first example, a Function is applied to return the String in uppercase.

Second example making usage of flatMap :

In the second example, a Stream of List is passed. It is NOT a Stream of Integer!
If a transformation Function has to be used (through map), then first the Stream has to be flattened to something else (a Stream of Integer).
If flatMap is removed then the following error is returned: The operator + is undefined for the argument type(s) List, int.
It is NOT possible to apply + 1 on a List of Integers!

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Please go through the post fully to get a clear idea,

map vs flatMap:

To return a length of each word from a list, we would do something like below..

Short Version given below

When we collect two lists, given below

Without flat map => [1,2],[1,1] => [[1,2],[1,1]] Here two lists are placed inside a list, so the output will be list containing lists

With flat map => [1,2],[1,1] => [1,2,1,1] Here two lists are flattened and only the values are placed in list, so the output will be list containing only elements

Basically it merges all the objects in to one

## Detailed Version has been given below:-

For example:-
Consider a list [β€œSTACK”, ”OOOVVVER”] and we are trying to return a list like [β€œSTACKOVER”](returning only unique letters from that list) Initially, we would do something like below to return a list [β€œSTACKOVER”] from [β€œSTACK”, ”OOOVVVER”]

Here the issue is, Lambda passed to the map method returns a String array for each word, So the stream returned by the map method is actually of type Stream, But what we need is Stream to represent a stream of characters, below image illustrates the problem.

Figure A:

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

You might think that, We can resolve this problem using flatmap,
OK, let us see how to solve this by using map and Arrays.stream First of all you gonna need a stream of characters instead of a stream of arrays. There is a method called Arrays.stream() that would take an array and produces a stream, for example:

The above still does not work, because we now end up with a list of streams (more precisely, Stream>), Instead, we must first convert each word into an array of individual letters and then make each array into a separate stream

By using flatMap we should be able to fix this problem as below:

flatMap would perform mapping each array not with stream but with the contents of that stream. All of the individual streams that would get generated while using map(Arrays::stream) get merged into a single stream. Figure B illustrates the effect of using the flatMap method. Compare it with what map does in figure A. Figure B Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

The flatMap method lets you replace each value of a stream with another stream and then joins all the generated streams into a single stream.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ map ΠΈ flatMap Π² Java 8?

16 ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

Π­Ρ‚ΠΎ отраТаСтся Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ flatMap ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Однако Π² Java это Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ количСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ноль ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. МоТно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ API, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция mapper для flatMap ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΈΠ»ΠΈ List Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄. Учитывая, Ρ‡Ρ‚ΠΎ это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², особСнно подходящим способом прСдставлСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ количСства Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сама функция mapper Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ! ЗначСния ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, выводятся ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. «Π‘густки» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сопоставлСния, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, поэтому Π²Ρ‹Ρ…ΠΎΠ΄ считаСтся «ΡΠΏΠ»ΡŽΡ‰Π΅Π½Π½Ρ‹ΠΌ».

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ привСсти 2 ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ зрСния:
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΊΠ°Ρ€Ρ‚Ρ‹:

НичСго особСнного Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, a Function примСняСтся для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° String Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования flatMap :

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ сообщСниС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ прСдставлСниС, map vs flatMap: Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова ΠΈΠ· списка, ΠΌΡ‹ сдСлаСм Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅..

НапримСр:-
Рассмотрим список [«STACK», «OOOVVVER»], ΠΈ ΠΌΡ‹ пытаСмся Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ список, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [«STACKOVER»] (возвращая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ· этого списка). Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ сдСлали Π±Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ список [«STACKOVER» ] ΠΈΠ· [«STACK», «OOOVVVER»]

Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Lambda, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΊΠ°Ρ€Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив String для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΡ‚ΠΎΠΊ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΊΠ°Ρ€Ρ‚Ρ‹, фактичСски ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Stream. Но Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Stream прСдставлял ΠΏΠΎΡ‚ΠΎΠΊ символов, Π½ΠΈΠΆΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Рисунок A:

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatmap,
Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ это Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ map ΠΈ Arrays.stream. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π²Π°ΠΌ понадобится ΠΏΠΎΡ‚ΠΎΠΊ символов вмСсто ΠΏΠΎΡ‚ΠΎΠΊΠ° массивов. БущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Arrays.stream(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ массив ΠΈ создаСт ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π’Ρ‹ΡˆΠ΅ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ список ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Ρ‚ΠΎΡ‡Π½Π΅Π΅, Stream>). ВмСсто этого ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ слово Π² массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΡƒΠΊΠ², Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatMap, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

flatMap Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сопоставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива Π½Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° с содСрТимым этого ΠΏΠΎΡ‚ΠΎΠΊΠ°. ВсС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ использовании ΠΊΠ°Ρ€Ρ‚Ρ‹ (Arrays :: stream), ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. Рисунок B ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ эффСкт использования ΠΌΠ΅Ρ‚ΠΎΠ΄Π° flatMap. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ€Ρ‚Π° Π½Π° рисункС A. Рисунок B Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

ΠœΠ΅Ρ‚ΠΎΠ΄ flatMap позволяСт Π²Π°ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС созданныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ map ΠΈ flatMap Π² Java 8?

Π’ Java 8, Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Stream.map ΠΈ Stream.flatMap ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ?

Π­Ρ‚ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ flatMap ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² Java для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ноль ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. МоТно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ API, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция mapper для flatMap ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΈΠ»ΠΈ List Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄. Учитывая, Ρ‡Ρ‚ΠΎ это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², особСнно ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ способом прСдставлСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ числа Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сама функция mapper Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ! ЗначСния ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, выводятся ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. «Π‘коплСния» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, поэтому говорят, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ «ΡΠ³Π»Π°ΠΆΠ΅Π½».

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ привСсти 2 ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ зрСния:
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΊΠ°Ρ€Ρ‚Ρ‹:

НичСго особСнного Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Function примСняСтся для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° String Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования flatMap :

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСдаСтся ΠΏΠΎΡ‚ΠΎΠΊ списка. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊ Ρ†Π΅Π»Ρ‹Ρ… чисСл!
Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ прСобразования (Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Ρ€Ρ‚Ρƒ), Ρ‚ΠΎ сначала ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ свСдСн ΠΊ Ρ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ (ΠΏΠΎΡ‚ΠΎΠΊ Ρ†Π΅Π»Ρ‹Ρ… чисСл).
Если flatMap ΡƒΠ΄Π°Π»Π΅Π½, возвращаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ошибка: ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ для Ρ‚ΠΈΠΏΠ° (ΠΎΠ²) Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² List, int.
НСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ + 1 ΠΊ списку Ρ†Π΅Π»Ρ‹Ρ… чисСл!

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, просмотритС ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ прСдставлСниС,

ΠΊΠ°Ρ€Ρ‚Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ² flatMap:

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова ΠΈΠ· списка, ΠΌΡ‹ Π±Ρ‹ сдСлали Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅.

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠ°Ρ вСрсия ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅

Когда ΠΌΡ‹ собираСм Π΄Π²Π° списка, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅

Π‘Π΅Π· плоская ΠΊΠ°Ρ€Ρ‚Π° => [1,2], [1,1] => [[1,2], [1,1]] Π—Π΄Π΅ΡΡŒ Π΄Π²Π° списка Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ списка, поэтому Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ список, содСрТащий списки

с плоской ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ => [1,2], [1,1] => [1,2,1,1] Π—Π΄Π΅ΡΡŒ Π΄Π²Π° списка свСдСны, ΠΈ Π² список ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, поэтому Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ список, содСрТащий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнты

По сути, ΠΎΠ½ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΎΠ΄ΠΈΠ½

Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ лямбда, пСрСданная ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΊΠ°Ρ€Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив String для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова, поэтому ΠΏΠΎΡ‚ΠΎΠΊ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΊΠ°Ρ€Ρ‚Ρ‹, Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Stream, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Stream для прСдставлСния ΠΏΠΎΡ‚ΠΎΠΊΠ° символов, Π½ΠΈΠΆΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Рисунок A:

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ плоской ΠΊΠ°Ρ€Ρ‚Ρ‹,
Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ map ΠΈ Arrays.stream ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π½ΡƒΠΆΠ΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ символов вмСсто ΠΏΠΎΡ‚ΠΎΠΊΠ° массивов. БущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Arrays.stream (), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ массив ΠΈ создаСт ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’Ρ‹ΡˆΠ΅ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Ρ‚ΠΎΡ‡Π½Π΅Π΅, Stream>). ВмСсто этого ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ слово Word Π² массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΡƒΠΊΠ², Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatMap, ΠΌΡ‹ смоТСм Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

flatMap Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сопоставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива Π½Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° с содСрТимым этого ΠΏΠΎΡ‚ΠΎΠΊΠ°. ВсС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ использовании map (Arrays :: stream), ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. На рисункС B ΠΏΠΎΠΊΠ°Π·Π°Π½ эффСкт использования ΠΌΠ΅Ρ‚ΠΎΠ΄Π° flatMap. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ‚Π° Π½Π° рисункС A. Рисунок B Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

ΠœΠ΅Ρ‚ΠΎΠ΄ flatMap позволяСт Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС созданныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.

Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java. Π€ΠΎΡ‚ΠΎ Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° map ΠΈ flatmap java

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с map() :

и с flatMap() :

Π­Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ тСста ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ :

для ΠΊΠ°Ρ€Ρ‚Ρ‹ Ρƒ нас Π΅ΡΡ‚ΡŒ список элСмСнтов ΠΈ (функция, дСйствиС) f Ρ‚Π°ΠΊ:

ΠΈ для плоской ΠΊΠ°Ρ€Ρ‚Ρ‹ Ρƒ нас Π΅ΡΡ‚ΡŒ список элСмСнтов списка, ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ (функция, дСйствиС) f, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±Ρ‹Π» свСдСн:

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использования Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… списков, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatMap :

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Oracle, посвящСнной Optional, подчСркиваСтся это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ ΠΈ плоской ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ:

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш ΠΊΠΎΠ΄ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ flatMap:

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° я ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡΡŒ с ΠΊΠ΅ΠΌ-Ρ‚ΠΎ, ΠΊΡ‚ΠΎ этого Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρƒ мСня Π΅ΡΡ‚ΡŒ список ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² ΡƒΡ‡Π΅Π½ΠΈΠΊΠΎΠ², Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΡ‡Π΅Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ нСсколько ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ².

map () ΠΈ flatMap ()

ПолСзно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ flapMap () ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ F Π³Π΄Π΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π‘Π°Ρ‡ΠΈΡ€ΠΈ Π’Π°ΡƒΡ„ΠΈΠΊΠ° см. ΠžΡ‚Π²Π΅Ρ‚ здСсь просты ΠΈ Π»Π΅Π³ΠΊΠΈ для понимания. ΠŸΡ€ΠΎΡΡ‚ΠΎ для ясности, скаТСм Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²:

ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π·Π½Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ языков:

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Stream.map () ΠΊ dev_team для получСния языков ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°:

даст Π²Π°ΠΌ эту структуру:

поэтому ΠΊΠΎΠ½Π΅Ρ† вашСго ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большС смысла, ΠΊΠ°ΠΊ это:

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ map () ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ flatMap () :

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ flatMap Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Stream Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ. EX Stream

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ flatMap ΠΈ map ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

flatMap ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всС элСмСнты ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, с flatMap для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈΠ· источника, функция Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько элСмСнтов. http://www.zoftino.com/Java-stream-examples#flatmap-operation

map ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Π΅Ρ€Π½Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, содСрТащий ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ элСмСнты. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, с map для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈΠ· источника функция создаст ΠΎΠ΄ΠΈΠ½ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ элСмСнт. http://www.zoftino.com/Java-stream-examples#map-operation

flatMap() Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ ΠΎΡ†Π΅Π½ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Он Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ нСобходимости ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. ПовСдСниС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ здСсь: ГарантируСтся, Ρ‡Ρ‚ΠΎ flatMap Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ?

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *