Search

Aggregate operations

Kotlin 컬렉션은 컬렉션 내용을 기반으로 단일 값을 반환하는 일반적으로 사용되는 집계 작업을 위한 함수를 포함하고 있다.

Aggregate

fun main() { val numbers = listOf(6, 42, 10, 4) println("Count: ${numbers.count()}") println("Max: ${numbers.maxOrNull()}") println("Min: ${numbers.minOrNull()}") println("Average: ${numbers.average()}") println("Sum: ${numbers.sum()}") }
Kotlin
복사
minOrNull() 또는 maxOrNull()
가장 작거나 큰 요소를 반환한다.
빈 컬렉션에서는 null을 반환한다.
average()
숫자 컬렉션의 요소 평균 값을 반환한다.
sum()
숫자 컬렉션의 요소 합계를 반환한다.
count()
컬렉션의 요소 수를 반환한다.
val numbers = listOf(5, 42, 10, 4) val min3Remainder = numbers.minByOrNull { it % 3 } println(min3Remainder) val strings = listOf("one", "two", "three", "four") val longestString = strings.maxWithOrNull(compareBy { it.length }) println(longestString)
Kotlin
복사
maxByOrNull() 또는 minByOrNull()
선택자 함수를 받아 해당 함수의 결과가 가장 큰 값 또는 가장 작은 값인 요소를 반환한다.
maxWithOrNull() 또는 minWithOrNull()
Comparator 객체를 받아 해당 Comparator에 따라 가장 큰 요소 또는 가장 작은 요소를 반환한다.
maxOfOrNull() 또는 minOfOrNull()
선택자 함수를 받아 해당 선택자의 결과값이 가장 큰 값이나 가장 작은 값을 반환한다.
maxOfWithOrNull() 또는 minOfWithOrNull()
Comparator 객체를 받아 해당 Comparator에 따라 가장 큰 선택자 결과값이나 가장 작은 선택자 결과값을 반환한다.
이 함수들은 빈 컬렉션에서 null을 반환한다.
빈 컬렉션에서 NoSuchElementException을 던지려면 이름에서 OrNull을 땐 함수를 사용하라.
val numbers = listOf(5, 42, 10, 4) println(numbers.sumOf { it * 2 }) println(numbers.sumOf { it.toDouble() / 2 })
Kotlin
복사
일반적인 sum() 외에 고급 합계 함수 sumOf() 가 있다.
이 함수는 선택자 함수를 받아 모든 컬렉션 요소에 대해 선택자의 결과의 합계를 반환한다.
선택자는 Int, Long, Double, UInt, ULong 등의 다양한 숫자 유형을 반환할 수 있다.

Fold and reduce

더 구체적인 경우를 위해 reduce()fold() 함수가 있다.
이 함수들은 제공된 작업을 컬렉션 요소에 순차적으로 적용하고 누적된 결과를 반환한다.
작업은 이전에 누적된 값과 컬렉션 요소의 두 가지 인수를 사용한다.
val numbers = listOf(5, 2, 10, 4) val simpleSum = numbers.reduce { sum, element -> sum + element } println(simpleSum) // 21 val sumDoubled = numbers.fold(0) { sum, element -> sum + element * 2 } println(sumDoubled) // 42 // 잘못된 예: 첫 번째 요소가 결과에서 두 배가 아닙니다. // val sumDoubledReduce = numbers.reduce { sum, element -> sum + element * 2 } // println(sumDoubledReduce)
Kotlin
복사
이 두 함수의 차이점
fold() : 초기 값을 받아 첫 번째 단계에서 누적된 값으로 사용
reduce() : 첫 번째 단계에서 첫 번째와 두 번째 요소를 인수로 사용
val numbers = listOf(5, 2, 10, 4) val sumDoubledRight = numbers.foldRight(0) { element, sum -> sum + element * 2 } println(sumDoubledRight)
Kotlin
복사
반대 순서로 요소에 작업을 적용하려면 reduceRight()foldRight() 함수를 사용하라.
val numbers = listOf(5, 2, 10, 4) val sumEven = numbers.foldIndexed(0) { idx, sum, element -> if (idx % 2 == 0) sum + element else sum } println(sumEven) val sumEvenRight = numbers.foldRightIndexed(0) { idx, element, sum -> if (idx % 2 == 0) sum + element else sum } println(sumEvenRight)
Kotlin
복사
인덱스를 매개변수로 사용하는 작업을 적용하려면 reduceIndexed()foldIndexed() 함수를 사용하라.
인덱스를 매개변수로 반대 순서로 요소에 작업을 적용하려면 reduceRightIndexed()foldRightIndexed() 함수를 사용하라.
모든 reduce 작업은 빈 컬렉션에서 예외를 던지므로 null을 받으려면 *OrNull()에 해당하는 함수를 사용하라.
val numbers = listOf(0, 1, 2, 3, 4, 5) val runningReduceSum = numbers.runningReduce { sum, item -> sum + item } val runningFoldSum = numbers.runningFold(10) { sum, item -> sum + item }
Kotlin
복사
중간 누적 값을 저장하여 List로 반환하려면 runningFold() (= scan()) 와 runningReduce() 함수를 사용하라.
인덱스를 매개변수로 사용하는 작업의 경우 runningFoldIndexed() 또는 runningReduceIndexed() 를 사용하라.