[Kotlin] 컬λ μ API : filter, map, all, any, count, find, groupBy, flatMap, flatten
λλ€ ν¨μν νλ‘κ·Έλλ°μ 컬λ μ (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() })
μ μ½λλ λ€μκ³Ό κ°μ λ λ¨κ³λ₯Ό μνν©λλ€.
- it.toList()λ₯Ό μ΄μ©νμ¬ ν΄λΉ μμλ‘ μ΄λ£¨μ΄μ§ 리μ€νΈκ° λ§λ€μ΄μ§λ€. => list("abc"), list("def")
- 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