컬렉션 함수형 API

이 글은 Kotlin in Action 서적을 참고했습니다!

filter

filter함수는 iteration하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다.

val list = listOf(1, 2, 3, 4)
list.filter {it % 2 == 0}

-> [2, 4]

위 코드의 결과는 술어를 만족하는 원소만으로 이뤄진 새로운 컬렉션이다.
filter함수는 컬렉션에서 원치 않는 원소를 제거하고, 원소를 변경할 수는 없다!
ex)

val list = listOf(1, 2, 3, 4)
list.filter {it+2} // 불가능

map

주어진 람다를 컬렉션의 각 원소에 적용한 결과를 모아서 새 컬렉션을 만든다.

val list = listOf(1, 2, 3, 4)
list.map {it * it}

-> [1, 4, 9, 16]

각 원소는 주어진 함수에 따라서 변환된 새로운 컬렉션이다!

all

모든 원소가 이 술어를 만족하는지 궁금할 때 사용하는 함수

val canBeClub27 = { p : Person -> p.age <= 27} // 27살 이상
val people = listOf(Person("Alice", 27), Person("Bob", 31))
people.all(caBeClub27)

-> false

any

술어를 만족하는 원소가 하나라도 있는지 궁금할 때 사용하는 함수

people.any(caBeClub27)

-> true

!all을 수행한 결과는 any를 수행한 결과와 같다 !any를 수행한 결과는 all을 수행한 결과와 같다. 하지만 가독성을 높히려면, any와 all 앞에 !를 붙이지 않는 편이 낫다!

count

술어를 만족하는 원소의 개수를 반환

people.count(caBeClub27)

-> 1

컬렉션을 필터링한 결과의 크기를 가져오는 경우

people.filter(caBeClub27).size

-> 1

하지만 이 경우에는 filter함수를 사용하므로 모든원소를 이터레이터하고, 중간 컬렉션이 생긴다.
(filter의 반환형은 List) 하지만 count는 조건을 만족하는 원소를 따로 저장하지않고, 갯수만 추적해 반환한다. 따라서 count함수가 더 효율적이다!

find

술어를 만족하는 원소를 하나만 찾고 싶을 때 사용하는 함수

people.find(caBeClub27)

-> Person(name=Alice, 27)

가장 먼저 조건을 만족한다고 확인된 원소를 반환하고, 없는 경우에는 null을 반환한다.
find는 firstOrNull과 같다!

groupBy

컬렉션의 모든 원소를 여러 그룹으로 나누고 싶을 때 사용하는 함수

val people = listOf(Person("Alice", 27), Person("Bob", 31), Person("Carol", 31))
people.groupBy {it.age}

-> {27=[Person(name=Alice, age=27)], 31=[Person(name=Bob, age=31), Person(name=Carol, age=31)]}

위 코드의 결과 값은 원소를 구분하는 특성(age)이 key이고 키 값에 따른 각 그룹이 맵이 된다.

좋은 웹페이지 즐겨찾기