Notice
Recent Posts
Recent Comments
Link
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐ŸŒฑ dreaming DiNO

[Kotlin] ์ปฌ๋ ‰์…˜ API : filter, map, all, any, count, find, groupBy, flatMap, flatten ๋ณธ๋ฌธ

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