코틀린 언어 정리 4-10

Collection operations

Common operations( 일반적인 연산들 )

Aggregation Operations

코틀린에서 일반적으로 잘 알려진 집계 연산들을 제공합니다. 컬렉션의 모든 요소들의 개수, 합계, 최소/최대값 등을 구하는 함수, 그 외 모든 요소들을 적용하여 임의의 연산을 수행할 수 있는 일반화된 fold, reduce등을 제공합니다.

숫자 계산 집계 함수들

Number Type 전용 집계 함수들

min/max

average/sum/count


selector나 comparator를 적용할 수 있는 함수들

maxBy/minBy, sumBy/sumByDouble

maxWith/minWith


일반화된 집계 함수들

fold and reduce

이전까지 모든 요소들의 누적 연산 결과와 현재 요소를 입력 받아 결과를 만들고 이 결과는 다시 다음 요소의 계산에 누적 연산 결과 값으로 전달합니다. fold, reduce 외에 더 일반화된 aggregate 함수도 있으나 이 함수는 Array / List 등에서는 지원하지 않고, groupingBy에 의해 리턴되는 Grouping<T, K> 클래스에서 지원합니다.

유사 함수들

fold, foldIndexed, foldRight, foldRightIndexed, reduce, reduceIndexed, reduceRightIndexed


주요 함수 형식

Receiver Type에 따라 각각 정의가 있으며 그 중 하나를 보면 다음과 같습니다.

inline fun <T, R> Array<out T>.fold ( initial: R, operation: { acc: R, ele: T }->R ): R

inline fun <S, T: S> Array<out T>.reduce ( operation: ( acc: S, ele: T )->S ): S


전체 예제

fun test () {

   var list_num = listOf(1, 30, 50, 3, 9, 87, 25)

   println("Number Type: sum, count, average, min, max 함수 적용")

   println(list_num.sum())

   println(list_num.count())

   println(list_num.average())

   println(list_num.min())

   println(list_num.max())

   println("-------------------------------------------------------------")


   println("String Type: selector를 이용한 집계 함수 sumBy, count, minBy, maxBy 적용.")

   var list_string = listOf("개", "돼지", "고양이", "소", "개", "말", "호랑이", "사자", "표범", "호랑이", "물범", "바다표범", "독수리")

   println(list_string.sumBy { it.length })

   println(list_string.count())

   //println(list_string.averageBy { it.length })// average는 selector 지정 함수가 없음.(averageBy 함수가 없음)

   println(list_string.minBy { it.length })

   println(list_string.maxBy { it.length })

   println("-------------------------------------------------------------")


   println("Number Type: fold and reduce 적용")

   println(list_num.fold(100) { acc: Int, element: Int -> acc + element })

   println(list_num.reduce { acc: Int, element: Int -> acc + element })

   println("-------------------------------------------------------------")


   println("String Type: fold and reduce 적용")

   println(list_string.fold("동물 친구들:") { acc: String, element: String -> acc + " " + element })

   println(list_string.foldIndexed("동물 친구들:") { index, acc, element -> acc + " " + "[$index]:$element" })

   println(list_string.foldRight("동물 친구들(역순):") { element, acc -> acc + " " + element })

   println(list_string.foldRightIndexed("동물 친구들(역순):") { index, element, acc -> "$acc [$index]:$element" })

   println(list_string.reduce { acc: String, element: String -> if ( element.length == 1 ) acc + " " + element else acc })

   println(list_string.reduceIndexed { index, acc, element -> "$acc [$index]:$element" })

   println(list_string.reduceRight { element, acc -> acc + " " + element })

   println(list_string.reduceRightIndexed { index, element, acc -> "$acc [$index]:$element" })

   println(list_string.filter { it.length == 1 }.reduce { acc, element -> acc + " " + element })

   println("-------------------------------------------------------------")

}


groupingBy를 이용한 reduce, fold, aggregate 예제

fun test () {

   /////////////////////////////////////

   // Array<out T> 계열의 fold and reduce

   var list = listOf("개", "고양이", "돼지", "소", "호랑이", "개", "고양이", "곰", "개")


   println(

       "aggregate함수 최종 출력 결과:" +

               list.groupingBy { it.length }.aggregate { key, accu: String?, element, first ->

                   println("$key, $accu, $element, $first")

                   (if (first) "" else accu) + element + " "

               }

   )


   println(

       "reduce 최종 출력 결과:" +

               list.groupingBy { it.length }.reduce { key, accu, ele ->

                   println("$key, $accu, $ele")

                   accu + " " + ele

               }

   )


   println(

       "fold 최종 출력 결과:" +

               list.groupingBy { it.length }.fold({ key, ele -> println("selector: $key, $ele"); "${key}글자 동물 친구들:" }) { key, accu, ele ->

                   println("$key, $accu, $ele")

                   accu + " " + ele

               }

   )


   return

}




+ Recent posts