Android

[Kotlin] μ»¬λ ‰μ…˜ API : filter, map, all, any, count, find, groupBy, flatMap, flatten

MK_____ 2021. 12. 27. 12:52

λžŒλ‹€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ»¬λ ‰μ…˜(Collection)을 λ‹€λ£° λ•Œ μƒλ‹Ήνžˆ νŽΈλ¦¬ν•˜κ³  λ§‰κ°•ν•©λ‹ˆλ‹€.

λŒ€λΆ€λΆ„μ˜ μž‘μ—…μ— 라이브러리 ν•¨μˆ˜λ₯Ό ν™œμš©ν•  수 있고, 그둜 인해 μ½”λ“œλ₯Ό μ•„μ£Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ μ΄λ²ˆμ—λŠ”, μ»¬λ ‰μ…˜μ„ λ‹€λ£¨λŠ” μ½”ν‹€λ¦° ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

참고둜, μ½”ν‹€λ¦°μ—μ„œ μ œκ³΅ν•˜λŠ” μ»¬λ ‰μ…˜ APIλŠ” μƒˆλ‘­κ²Œ μΆ”κ°€λœ 것이 μ•„λ‹Œ, 기쑴의 java, C#, 그루비, 슀칼라 λ“± λžŒλ‹€λ₯Ό μ§€μ›ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œ μ‚¬μš©ν•˜λŠ” 것듀과 λ™μΌν•©λ‹ˆλ‹€.

ν•„μˆ˜μ μΈ ν•¨μˆ˜ : filter, map

filter와 map은 μ»¬λ ‰μ…˜μ„ ν™œμš©ν•  λ•Œ 기반이 λ˜λŠ” ν•¨μˆ˜λ‘œ, λŒ€λΆ€λΆ„μ˜ μ»¬λ ‰μ…˜ 연산을 이 두 ν•¨μˆ˜λ₯Ό 톡해 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

filter

filter ν•¨μˆ˜λŠ” μ»¬λ ‰μ…˜μ„ iteration ν•˜λ©΄μ„œ μ£Όμ–΄μ§„ λžŒλ‹€μ— 각 μ›μ†Œλ₯Ό λ„˜κ²¨μ„œ λžŒλ‹€κ°€ trueλ₯Ό λ°˜ν™˜ν•˜λŠ”(쑰건에 λ§žλŠ”) μ›μ†Œλ§Œ ν•„ν„°λ§ν•˜λŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€.

filter의 κ²°κ³ΌλŠ”, μž…λ ₯ μ»¬λ ‰μ…˜μ˜ μ›μ†Œ μ€‘μ—μ„œ μ£Όμ–΄μ§„ 쑰건문에 λ§Œμ‘±ν•˜λŠ” μ›μ†Œλ§ŒμœΌλ‘œ 이루어진 μƒˆλ‘œμš΄ μ»¬λ ‰μ…˜ μž…λ‹ˆλ‹€.

 

/* λ¦¬μŠ€νŠΈμ—μ„œ 짝수만 λ½‘μ•„λ‚΄λŠ” 예제 */

>>> val list = listOf(1, 2, 3, 4)
>>> println(list.filter { it % 2 == 0 }) //짝수만 필터링
[2, 4]

 

그림으둜 ν‘œν˜„ν•˜μžλ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

filter ν•¨μˆ˜λŠ” 쑰건을 λ§Œμ‘±ν•˜λŠ” λͺ¨λ“  μ›μ†Œλ‘œλ§Œ 이루어진 μƒˆλ‘œμš΄ μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€. 

 

λ‹€λ₯Έ 예제둜, λ‚˜μ΄κ°€ 30μ‚΄ 이상인 μ‚¬λžŒλ§Œ μΆ”λ €λ‚΄κΈ° μœ„ν•΄μ„œ filterλ₯Ό μ‚¬μš©ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

/* λ‚˜μ΄κ°€ 30μ‚΄ 이상인 μ‚¬λžŒλ§Œ λ½‘μ•„λ‚΄λŠ” 예제 */

>>> val people = listOf(Person("μ•ˆλ“œλ‘œμ΄λ“œ", 29), Person("μ½”ν‹€λ¦°", 30))
>>> println(people.filter { it.age >= 30 })
[Person(name=μ½”ν‹€λ¦°, age=30)]

 

이렇듯, filter ν•¨μˆ˜λŠ” μ»¬λ ‰μ…˜μ—μ„œ μ›μΉ˜ μ•ŠλŠ” μ›μ†Œλ“€μ„ μ œκ±°ν•΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, filterλŠ” μ›μ†Œλ₯Ό λ³€ν™˜ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ›μ†Œλ₯Ό λ³€ν™˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” map ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

map

map ν•¨μˆ˜λŠ” κ° μ›μ†Œλ₯Ό μ›ν•˜λŠ” ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” κΈ°λŠ₯을 ν•˜λ©°, λ³€ν™˜ν•œ κ²°κ³Όλ₯Ό λͺ¨μ•„μ„œ μƒˆ μ»¬λ ‰μ…˜μ„ λ§Œλ“­λ‹ˆλ‹€.

κ²°κ³ΌλŠ” 원본 λ¦¬μŠ€νŠΈμ™€ μ›μ†Œ κ°œμˆ˜λŠ” κ°™μ§€λ§Œ, 각 μ›μ†ŒλŠ” μ£Όμ–΄μ§„ λžŒλ‹€(ν•¨μˆ˜)에 따라 λ³€ν™˜λœ μƒˆλ‘œμš΄ μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€. 

 

/* 각 μ›μ†Œμ˜ 제곱으둜 λͺ¨μΈ 리슀트λ₯Ό λ§Œλ“œλŠ” map 예제 */

>>> val list = listOf(1, 2, 3, 4)
>>> println(list.map { it * it }) //제곱 λ§Œλ“€κΈ° (1x1, 2x2, 3x3, 4x4)
[1, 4, 9, 16]

 

map ν•¨μˆ˜λŠ” λžŒλ‹€λ₯Ό μ»¬λ ‰μ…˜μ˜ λͺ¨λ“  μ›μ†Œμ— μ μš©ν•œ 결과둜 이루어진 μƒˆλ‘œμš΄ μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.

 

예둜, μ‚¬λžŒ λ¦¬μŠ€νŠΈκ°€ μ•„λ‹Œ 이름 리슀트λ₯Ό 좜λ ₯ν•˜κ³  μ‹Άλ‹€λ©΄ map으둜 μ‚¬λžŒ 리슀트λ₯Ό 이름 리슀트둜 λ³€ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

/* μ‚¬λžŒ 리슀트 -> 이름 리슀트 λ³€ν™˜ 예제 */

>>> val people = listOf(Person("μ•ˆλ“œλ‘œμ΄λ“œ", 29), Person("μ½”ν‹€λ¦°", 30))
>>> println(people.map { it.name })
[μ•ˆλ“œλ‘œμ΄λ“œ, μ½”ν‹€λ¦°]

 

이 예제λ₯Ό λžŒλ‹€μ˜ 멀버 μ°Έμ‘°λ₯Ό μ‚¬μš©ν•΄μ„œ 더 λ©‹μ§€κ²Œ μž‘μ„±ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

/* 멀버 μ°Έμ‘° 문법 */
people.map(Person::name)

 

이제 μš°λ¦¬λŠ” 이런 ν•¨μˆ˜λ“€μ„ μ—°μ‡„μ‹œμΌœμ„œ, μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ‰½κ²Œ μ–»μ–΄λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€!

예λ₯Ό λ“€μ–΄, 30μ‚΄ 이상인 μ‚¬λžŒμ˜ 이름을 좜λ ₯ν•˜λ €λŠ” 경우

 

>>> people.filter { it.age >= 30 }.map(Person::name)
[μ½”ν‹€λ¦°]

 

이와 같이, μ»¬λ ‰μ…˜ ν•¨μˆ˜λ₯Ό μ—°μ‡„μ‹œμΌœ μ•„μ£Ό μ‰½κ²Œ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ–»μ–΄λ‚΄μ—ˆμŠ΅λ‹ˆλ‹€!

 

κ·Έλ ‡λ‹€λ©΄, 이제 λ¦¬μŠ€νŠΈμ—μ„œ κ°€μž₯ λ‚˜μ΄ λ§Žμ€ μ‚¬λžŒμ˜ 이름을 μ•Œκ³  μ‹Άλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

음~λ¨Όμ € μ‚¬λžŒ 리슀트의 λ‚˜μ΄ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜κ³ , κ·Έ μ΅œλŒ“κ°’κ³Ό λ‚˜μ΄κ°€ 같은 μ‚¬λžŒμ„ λ°˜ν™˜ν•˜λ©΄ 되겠죠?

 

λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λ©΄ 이런 μ½”λ“œλ₯Ό μ‰½κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

/* filter 'λ‚΄λΆ€'μ—μ„œ maxBy 이용 [λΉ„νš¨μœ¨μ  μ½”λ“œ] */
people.filter { it.age == people.maxBy(Person::age)!!.age }

/* filter 'μ™ΈλΆ€'μ—μ„œ maxBy 이용 [효율적 μ½”λ“œ] */
val maxAge = people.maxBy(Person::age)!!.age
people.filter { it.age == maxAge }

 

첫 번째 μ½”λ“œλŠ” filter μ•ˆμ—μ„œ μ΅œλŒ“κ°’ κ΅¬ν•˜λŠ” μž‘μ—…μ„ 계속 λ°˜λ³΅ν•˜κΈ° λ•Œλ¬Έμ—, λ§Œμ•½ 100λͺ…μ˜ λ¦¬μŠ€νŠΈκ°€ μžˆλ‹€λ©΄ filterλ₯Ό λŒλ©΄μ„œ 100번 μ΅œλŒ“κ°’ 연산을 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μƒλ‹Ήνžˆ λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€.

그에 λΉ„ν•΄, 두 번째 μ½”λ“œλŠ” μ΅œλŒ“κ°’μ„ ν•œ 번만 κ³„μ‚°ν•˜κ²Œ λ§Œλ“  μ½”λ“œμ΄κΈ° λ•Œλ¬Έμ— 훨씬 더 κ°œμ„ λ˜κ³  효율적인 μ½”λ“œλΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ, λ¬΄μž‘μ • μ½”λ“œλŸ‰μ„ 쀄이렀고 μ‚¬μš©ν•˜κΈ°λ³΄λ‹€λŠ”, λΆˆν•„μš”ν•œ 반볡이 μ—†λŠ”μ§€ λ“±... 내뢀적인 λ™μž‘μ— λŒ€ν•΄μ„œ κ³ λ €ν•œ 후에 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ‹œλŠ” 게 더 쒋은 μ½”λ“œκ°€ 될 수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€. ^^

 

filter와 map ν•¨μˆ˜λ₯Ό Map(Key, Value) 에도 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Map(Key, Value)의 경우 킀와 값을 μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜κ°€ λ”°λ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

  • Key μΆ”μΆœ : filterKeys, mapKeys
  • Value μΆ”μΆœ : filterValues, mapValues
>>> val numbers = mapOf(0 to "zero", 1 to "one")
>>> println(numbers.mapValues { it.value.toUpperCase() }) //값을 λŒ€λ¬Έμžλ‘œ λ³€ν™˜
{0=ZERO, 1=ONE}

all, any, count, find : μ»¬λ ‰μ…˜ 쑰건 ν•¨μˆ˜

μ»¬λ ‰μ…˜μ— λŒ€ν•΄ 자주 μˆ˜ν–‰ν•˜λŠ” 쑰건 ν•¨μˆ˜λ“€μ— λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

api description return type
all μ»¬λ ‰μ…˜μ˜ λͺ¨λ“  μ›μ†Œκ°€ 쑰건을 λ§Œμ‘±ν•˜λŠ”μ§€ νŒλ‹¨ Boolean
any μ»¬λ ‰μ…˜μ˜ μ›μ†Œ 쀑에, 쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œκ°€ ν•˜λ‚˜λΌλ„ μžˆλŠ”μ§€ νŒλ‹¨ Boolean
count 쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œμ˜ 개수λ₯Ό λ°˜ν™˜ Int
find 쑰건을 λ§Œμ‘±ν•˜λŠ” 첫번째 μ›μ†Œλ₯Ό λ°˜ν™˜ <T>

 

이런 ν•¨μˆ˜λ“€μ˜ λ™μž‘μ„ μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄, 예제둜 λ‚˜μ΄κ°€ 30μ‚΄ λ―Έλ§ŒμΈμ§€ νŒλ‹¨ν•˜λŠ” μ½”λ“œλ₯Ό κ΅¬ν˜„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

all, any

 

val under30 = { p:Person -> p.age < 30 }

//λͺ¨λ“  μ›μ†Œκ°€ λ§Œμ‘±ν•˜λŠ”μ§€ νŒλ‹¨ν•˜λ €λ©΄ all ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
>>> val people = listOf(Person("μ•ˆλ“œλ‘œμ΄λ“œ", 25), Person("μ½”ν‹€λ¦°", 33))
>>> println(people.all(under30))
false

//ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜λŠ” μ›μ†Œκ°€ μžˆλŠ”μ§€ νŒλ‹¨ν•˜λ €λ©΄ any ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
>>> println(people.any(under30))
true

 

팁으둜, !allκ³Ό !anyλ₯Ό μ‚¬μš©ν•  순 μžˆμ§€λ§Œ, 
λ‹€λ§Œ ( !all = any ), ( !any = all ) 와 같은 κ²½μš°μ—λŠ” μ•žμ— ! μ—°μ‚°μžλ₯Ό 눈치 채지 λͺ»ν•˜λŠ” κ²½μš°κ°€ 있기 λ•Œλ¬Έμ— κ°€λ…성을 높이기 μœ„ν•΄ 가급적이면 any와 all μ•žμ— ! λ₯Ό 뢙이지 μ•ŠλŠ” 편이 λ‚«μŠ΅λ‹ˆλ‹€!

 

count

쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œμ˜ 개수λ₯Ό ꡬ할 λ•ŒλŠ” countλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

val under30 = { p:Person -> p.age < 30 }

>>> val people = listOf(Person("μ•ˆλ“œλ‘œμ΄λ“œ", 25), Person("μ½”ν‹€λ¦°", 33))
>>> println(people.count(under30))
1

 

ν•¨μˆ˜λ₯Ό 효과적으둜 μ‚¬μš©ν•˜κΈ° : count와 size

count ν•¨μˆ˜κ°€ μžˆλ‹€λŠ” 사싀을 μžŠμ–΄λ²„λ¦¬κ³ , μ»¬λ ‰μ…˜μ„ ν•„ν„°λ§ν•œ 결과의 크기λ₯Ό size둜 κ°€μ Έμ˜€λŠ” κ²½μš°κ°€ μ’…μ’… μžˆμŠ΅λ‹ˆλ‹€.

>>> println(people.filter(under30).size)
1

ν•˜μ§€λ§Œ, μ΄λ ‡κ²Œ μ²˜λ¦¬ν•˜λ©΄ 쑰건을 λ§Œμ‘±ν•˜λŠ” λͺ¨λ“  μ›μ†Œκ°€ λ“€μ–΄κ°€λŠ” 쀑간 μ»¬λ ‰μ…˜μ΄ μƒκ²¨λ²„λ¦¬κ²Œ λ©λ‹ˆλ‹€.
λ°˜λ©΄μ—, countλŠ” 쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œμ˜ κ°œμˆ˜λ§Œμ„ μΆ”μ ν•˜μ§€ μ›μ†Œλ₯Ό λ”°λ‘œ μ €μž₯ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ—,
λ”°λΌμ„œ countκ°€ 훨씬 더 효율적이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

find

findλŠ” 쑰건을 λ§Œμ‘±ν•˜λŠ” 첫 번째 μ›μ†Œλ₯Ό λ°˜ν™˜ν•˜κ³ , λ§Œμ‘±ν•˜λŠ” μ›μ†Œκ°€ μ—†λ‹€λ©΄ null을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

val under30 = { p:Person -> p.age < 30 }

>>> val people = listOf(Person("μ•ˆλ“œλ‘œμ΄λ“œ", 25), Person("μ½”ν‹€λ¦°", 33))
>>> println(people.find(under30))
Person(name=μ•ˆλ“œλ‘œμ΄λ“œ, age=25)

 

findλŠ” 쑰건에 λ§Œμ‘±ν•˜λŠ” 첫번째 μ›μ†Œλ₯Ό λ°˜ν™˜ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— firstOrNullκ³Ό κΈ°λŠ₯이 λ™μΌν•©λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ—, 쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œκ°€ μ—†μœΌλ©΄ null이 λ‚˜μ˜¨λ‹€λŠ” 사싀을 μ’€ 더 λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κ³  μ‹Άλ‹€λ©΄ firstOrNull을 μ‚¬μš©ν•΄λ„ λ¬΄λ°©ν•©λ‹ˆλ‹€. ^^

groupBy : 리슀트λ₯Ό μ—¬λŸ¬ 그룹으둜 이루어진 맡으둜 λ³€κ²½

μ»¬λ ‰μ…˜μ˜ λͺ¨λ“  μ›μ†Œλ₯Ό μ–΄λ–€ νŠΉμ„±μ— 따라 μ—¬λŸ¬ 그룹으둜 λ‚˜λˆ„κ³  싢은 κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

이런 λΆ„λ₯˜ νŠΉμ„±μ„ νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•˜λ©΄ μ»¬λ ‰μ…˜μ„ μžλ™μœΌλ‘œ κ΅¬λΆ„ν•΄μ£ΌλŠ” ν•¨μˆ˜κ°€ 있으면 μ°Έ~ νŽΈλ¦¬ν•  κ²ƒμž…λ‹ˆλ‹€.

groupBy ν•¨μˆ˜κ°€ 그런 역할을 ν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, μ‚¬λžŒμ„ λ‚˜μ΄μ— 따라 λΆ„λ₯˜ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 

 

/* groupBy 예제 */

>>> val people = listOf(
          Person("μ•ˆλ“œλ‘œμ΄λ“œ", 25),
          Person("μ½”ν‹€λ¦°", 30),
          Person("μžλ°”", 30))
>>> println(people.groupBy { it.age })

{ 25=[Person(name=μ•ˆλ“œλ‘œμ΄λ“œ, age=25)],
  30=[Person(name=μ½”ν‹€λ¦°, age=30), Person(name=μžλ°”, age=30)] }

 

이 μ—°μ‚°μ˜ κ²°κ³ΌλŠ” μ•„λž˜μ™€ 같은 λ§΅(Map)μž…λ‹ˆλ‹€.

  • Key : μ›μ†Œλ₯Ό κ΅¬λΆ„ν•˜λŠ” νŠΉμ„± (μ˜ˆμ œμ—μ„œλŠ” age)
  • Value : Key 값에 λ”°λ₯Έ 각 κ·Έλ£Ή 리슀트 (μ˜ˆμ œμ—μ„œλŠ” Person 객체 리슀트)

그림으둜 ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

groupBy ν•¨μˆ˜λ₯Ό μ μš©ν•œ κ²°κ³Ό

 

λˆˆμΉ˜μ±„μ…¨μ„ μˆ˜λ„ μžˆκ² μ§€λ§Œ, 각 그룹은 λ¦¬μŠ€νŠΈμž…λ‹ˆλ‹€.
λ”°λΌμ„œ, μœ„μ˜ groupBy κ²°κ³Ό νƒ€μž…μ€ Map<Int, List<Person>>이 λ©λ‹ˆλ‹€.

flatMapκ³Ό flatten : μ€‘μ²©λœ μ»¬λ ‰μ…˜ μ•ˆμ˜ μ›μ†Œ 처리

flatMap은 μ£Όμ–΄μ§„ λžŒλ‹€λ₯Ό μ»¬λ ‰μ…˜μ˜ λͺ¨λ“  객체에 μ μš©ν•˜κ³ , μ μš©ν•œ 결과둜 μ–»μ–΄μ§€λŠ” μ—¬λŸ¬ 리슀트λ₯Ό ν•œ 리슀트둜 flat ν•˜κ²Œ λ§Œλ“œλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

즉, map을 μ²˜λ¦¬ν•˜κ³  λ‚œ λ‹€μŒμ˜ κ²°κ³Όκ°€ list인 경우, 이 list의 μ›μ†Œλ₯Ό λ‹€μ‹œ νŽΌμ³μ„œ ν•˜λ‚˜μ˜ list둜 λ§Œλ“­λ‹ˆλ‹€.

말이 쑰금 μ–΄λ ΅κ³  정신없을 수 μžˆμ§€λ§Œ, "리슀트의 리슀트λ₯Ό μ²˜λ¦¬ν•  λ•Œ μ“°λŠ” ν•¨μˆ˜" λ‘œ κΈ°μ–΅ν•΄μ£Όμ‹œλ©΄ μ‰¬μšΈ 것 κ°™μŠ΅λ‹ˆλ‹€!

 

예제λ₯Ό ν•˜λ‚˜ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

>>> val strings = listOf("abc", "def")
>>> println(strings.flatMap { it.toList() })

 

μœ„ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 두 단계λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  1. it.toList()λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή μ›μ†Œλ‘œ 이루어진 λ¦¬μŠ€νŠΈκ°€ λ§Œλ“€μ–΄μ§„λ‹€. => list("abc"), list("def")
  2. flatMap이 list의 μ›μ†Œλ₯Ό flat ν•˜κ²Œ λͺ¨λ“  μ›μ†Œλ‘œ 이루어진 단일 리슀트λ₯Ό λ°˜ν™˜ν•œλ‹€. => list("a", "b", "c", "d", "e", "f")

κ·Έλ¦¬ν•˜μ—¬ 좜λ ₯의 κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

[a, b, c, d, e, f]

 

리슀트 μ›μ†Œλ₯Ό μ‚¬μš©ν•΄μ„œ νŠΉλ³„νžˆ λ³€ν™˜ν•΄μ•Ό ν•  λ‚΄μš©μ΄ μ—†λ‹€λ©΄, λ‹¨μˆœνžˆ 리슀트의 리슀트λ₯Ό ν‰ν‰ν•˜κ²Œ 펼치기만 ν•˜λŠ” flatten ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

마무리

μ§€κΈˆκΉŒμ§€ μ½”ν‹€λ¦° ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ œκ³΅ν•˜λŠ” λͺ‡ κ°€μ§€ μ»¬λ ‰μ…˜ μ—°μ‚° ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ¬Όλ‘  이 외에도 더 λ§Žμ€ ν•¨μˆ˜κ°€ 있기 λ•Œλ¬Έμ—, λŒ€λΆ€λΆ„μ˜ 경우 μ›ν•˜λŠ” ν•¨μˆ˜λ₯Ό 잘 μ°ΎμœΌμ…”μ„œ ν™œμš©ν•˜μ‹œλ©΄ 직접 μ½”λ“œλ‘œ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 것보닀 더 λΉ λ₯΄κ³  μ‰½κ²Œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€. ^^ 

 

좜처 : https://0391kjy.tistory.com/38

 

μ½”ν‹€λ¦°(Kotlin) - μ»¬λ ‰μ…˜ API : filter, map, all, any, count, find, groupBy, flatMap, flatten

λžŒλ‹€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ»¬λ ‰μ…˜(Collection)을 λ‹€λ£° λ•Œ μƒλ‹Ήνžˆ νŽΈλ¦¬ν•˜κ³  λ§‰κ°•ν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μž‘μ—…μ— 라이브러리 ν•¨μˆ˜λ₯Ό ν™œμš©ν•  수 있고, 그둜 인해 μ½”λ“œλ₯Ό μ•„μ£Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ

0391kjy.tistory.com