•
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() 를 사용하라.