함수형 프로그래밍 스타일을 사용하면 컬렉션을 다룰 때 편리하다. 대부분의 작업에 라이브러리 함수를 활용할 수 있고 그로 인해 코드를 아주 간결하게 만들 수 있다.
filter와 map은 컬렉션을 활용할 때 기반이 되는 함수다. 대부분의 컬렉션 연산을 이 두 함수를 통해 표현할 수 있다.
filter 함수는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다.
fun main() {
val list = listOf(1, 2, 3, 4)
println(list.filter { it % 2 == 0 })
}
// [2, 4]
결과는 입력 컬렉션의 원소 중에서 주어진 술어(참/거짓을 반환하는 함수를 술어라고 한다)를 만족하는 원소만으로 이뤄진 새로운 컬렉션이다.
map 함수는 주어진 람다를 컬렉션의 각 원소에 적용한 결과를 모아서 새 컬렉션을 만든다.
fun main() {
val list = listOf(1, 2, 3, 4)
println(list.map { it * it })
}
// [1, 4, 9, 16]
결과는 원본 리스트의 원소의 개수와 같지만, 각 원소는 주어진 함수에 따라 반환된 새로운 컬렉션이다.
멤버 참조를 사용해 다음과 같이 호출할 수도 있다.
data class Person(
val name: String,
val age: Int,
)
fun main() {
val people = listOf(Person("A", 1), Person("B", 2))
println(people.map(Person::name))
}
필터와 변환 함수를 Map 자료형에 적용할 수도 있다.
fun main() {
val numbers = mapOf(0 to "zero", 1 to "one")
println(numbers.mapValues { it.value.uppercase() })
}
// {0=ZERO, 1=ONE}
filterKeys, mapKeys는 키를 걸러 내거나 변환하고, filterVaules, mapVaules는 값을 걸러 내거나 변환한다.
all, any → 컬렉션의 모든 원소가 어떤 조건을 만족하는지 판단하는 연산
count → 조건을 만족하는 원소의 개수를 반환하는 연산