코틀린은 함수형 프로그래밍을 지원하기 위해서 고차 함수를 지원한다. 고차함수는 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 말한다. 이를 통해 코드의 재사용성과 추상화 수준을 높일 수 있다.
오늘은 고차 함수 중 map, filter, reduce, fold, forEach, any, all, groupBy, sortedBy, zip, flatmap, takeWhile, dropWhile까지 알아보겠다.
map()은 컬렉션의 각 요소에 대해 주어진 함수를 적용하여 새로운 컬렉션을 반환한다.
val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10]
filter()는 컬렉션에 각 요소에 대해 주어진 조건을 만족하는 요소들로 새로운 컬렉션을 반환한다.
val numbers = listOf(1, 2, 3, 4, 5)
val evens = numbers.filter { it % 2 == 0 } // [2, 4]
reduce()는 컬렉션의 모든 요소를 하나의 값으로 줄인다.
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.reduce { acc, n -> acc + n } // 15
fold()는 컬렉션의 모든 요소를 하나의 값으로 줄입니다. reduce와 달리 초기값을 지정할 수 있습니다.
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(0) { acc, n -> acc + n } // 15
forEach()는 컬렉션의 각 요소에 대한 주어진 함수를 적용합니다.
val numbers = listOf(1, 2, 3, 4, 5)
numbers.forEach { println(it) }
any()는 컬렉션의 요소 중 하나라도 주어진 조건을 만족하면 true를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val hasEven = numbers.any { it % 2 == 0 } // true
all()은 컬렉션의 요소들 모두가 주어진 조건을 만족하면 true를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val allPositive = numbers.all { it > 0 } // true
groupBy()는 컬렉션의 각 요소를 주어진 함수의 결과값에 따라서 그룹화해 Map으로 반환합니다.
data class Person(val name: String, val age: Int)
val people = listOf(
Person("Alice", 20),
Person("Bob", 30),
Person("Charlie", 20)
)
// {20=[Person(name=Alice, age=20), Person(name=Charlie, age=20)], 30=[Person(name=Bob, age=30)]}
val grouped = people.groupBy { it.age }
sortedBy()는 컬렉션의 각 요소를 주어진 함수의 결과값에 따라 정렬한 새로운 리스트를 반환합니다.
val people = listOf(
Person("Alice", 20),
Person("Bob", 30),
Person("Charlie", 25)
)
// [Person(name=Alice, age=20), Person(name=Charlie, age=25), Person(name=Bob, age=30)]
val sortedByAge = people.sortedBy { it.age }
zip()은 두 개 이상의 컬렉션을 조합하여 새로운 컬렉션을 만듭니다.
val numbers = listOf(1, 2, 3)
val words = listOf("one", "two", "three")
val zipped = numbers.zip(words) // [(1, "one"), (2, "two"), (3, "three")]
flatMap()은 컬렉션의 각 요소에 대해 주어진 함수를 적용한 결과를 담은 여러 개의 컬렉션을 합쳐서 새로운 컬렉션을 만듭니다.
val words = listOf("hello", "world")
val flattened = words.flatMap { it.toList() } // [h, e, l, l, o, w, o, r, l, d]
takeWhile()은 컬렉션의 요소 중 주어진 조건을 만족하는 요소들만을 새로운 리스트로 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val taken = numbers.takeWhile { it < 3 } // [1, 2]
dropWhile()은 컬렉션의 요소 중 주어진 조건을 만족하는 요소들을 제외한 나머지 요소들로 (조건에 만족하지 않는) 새로운 리스트를 만들어 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val dropped = numbers.dropWhile { it < 3 } // [3, 4, 5]