kotlin 고차함수 (High-order-function)

김희망·2023년 4월 10일
1

개발일지

목록 보기
9/17
post-thumbnail

고차 함수

코틀린은 함수형 프로그래밍을 지원하기 위해서 고차 함수를 지원한다. 고차함수는 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 말한다. 이를 통해 코드의 재사용성과 추상화 수준을 높일 수 있다.

오늘은 고차 함수 중  map, filter, reduce, fold, forEach, any, all, groupBy, sortedBy, zip, flatmap, takeWhile, dropWhile까지 알아보겠다.

map()

map()은 컬렉션의 각 요소에 대해 주어진 함수를 적용하여 새로운 컬렉션을 반환한다. 

val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10]

filter()

filter()는 컬렉션에 각 요소에 대해 주어진 조건을 만족하는 요소들로 새로운 컬렉션을 반환한다.

val numbers = listOf(1, 2, 3, 4, 5)
val evens = numbers.filter { it % 2 == 0 } // [2, 4]

reduce()

reduce()는 컬렉션의 모든 요소를 하나의 값으로 줄인다.

val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.reduce { acc, n -> acc + n } // 15

fold()

fold()는 컬렉션의 모든 요소를 하나의 값으로 줄입니다. reduce와 달리 초기값을 지정할 수 있습니다.

val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(0) { acc, n -> acc + n } // 15

forEach()

forEach()는 컬렉션의 각 요소에 대한 주어진 함수를 적용합니다.

val numbers = listOf(1, 2, 3, 4, 5)
numbers.forEach { println(it) }

any()

any()는 컬렉션의 요소 중 하나라도 주어진 조건을 만족하면 true를 반환합니다.

val numbers = listOf(1, 2, 3, 4, 5)
val hasEven = numbers.any { it % 2 == 0 } // true

all()

all()은 컬렉션의 요소들 모두가 주어진 조건을 만족하면 true를 반환합니다.

val numbers = listOf(1, 2, 3, 4, 5)
val allPositive = numbers.all { it > 0 } // true

groupBy()

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()

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()

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()

flatMap()은 컬렉션의 각 요소에 대해 주어진 함수를 적용한 결과를 담은 여러 개의 컬렉션을 합쳐서 새로운 컬렉션을 만듭니다.

val words = listOf("hello", "world")
val flattened = words.flatMap { it.toList() } // [h, e, l, l, o, w, o, r, l, d]

takeWhile()

takeWhile()은 컬렉션의 요소 중 주어진 조건을 만족하는 요소들만을 새로운 리스트로 반환합니다.

val numbers = listOf(1, 2, 3, 4, 5)
val taken = numbers.takeWhile { it < 3 } // [1, 2]

dropWhile()

dropWhile()은 컬렉션의 요소 중 주어진 조건을 만족하는 요소들을 제외한 나머지 요소들로 (조건에 만족하지 않는) 새로운 리스트를 만들어 반환합니다.

val numbers = listOf(1, 2, 3, 4, 5)
val dropped = numbers.dropWhile { it < 3 } // [3, 4, 5]
profile
소프트웨어 엔지니어, 김희망입니다.

0개의 댓글