함수형 프로그래밍 스타일을 사용하면 컬렉션을 다룰 때 편리하다. 대부분의 작업에 라이브러리 함수를 활용할 수 있고 그로 인해 코드를 아주 간결하게 만들 수 있다.

필수적인 함수 filter와 map

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, find : 컬렉션에 술어 적용

all, any → 컬렉션의 모든 원소가 어떤 조건을 만족하는지 판단하는 연산

count → 조건을 만족하는 원소의 개수를 반환하는 연산