Hanbit the Developer

Kotlin Documentation | Aggregate operations 본문

Mobile/Kotlin

Kotlin Documentation | Aggregate operations

hanbikan 2023. 5. 24. 14:46

Kotlin Documentation 시리즈에 대해

Category: Standard library - Collections

문서 링크: https://kotlinlang.org/docs/collection-aggregate.html


  • minOrNull(), maxOrNull()
  • average()
  • sum()
    • sumOf()
    val numbers = listOf(5, 42, 10, 4)
    println(numbers.sumOf { it * 2 })
    println(numbers.sumOf { it.toDouble() / 2 })
    
    122
    30.5
    
  • count()

셀렉터를 이용하여 최소값 및 최대값을 검색하는 함수:

  • maxByOrNull(), minByOrNull()
  • maxWithOrNull(), minWithOrNull()
  • maxOfOrNull(), minOfOrNull()
  • maxOfWithOrNull(), minOfWithOrNull()

Fold and reduce

컬렉션을 돌면서 값을 모으는 함수이다.

  • fold(): 초기값이 있다.
  • reduce(): 초기값이 item[0]이며, item[1]부터 반복을 시작한다.
val numbers = listOf(1, 2, 3, 4)

val sumDoubled = numbers.fold(3) { sum, element -> println("sum: $sum, element: $element"); sum + element * 2 }
println(sumDoubled)
val simpleSum = numbers.reduce { sum, element -> println("sum: $sum, element: $element"); sum + element }
println(simpleSum)

// 1 + 2*2 + 3*2 + 4*2가 수행된다.(1*2 + 2*2 + 3*2 + 4*2가 아니라)
// val sumDoubledReduce = numbers.reduce { sum, element -> sum + element * 2 } 
// println(sumDoubledReduce)
sum: 3, element: 1
sum: 5, element: 2
sum: 9, element: 3
sum: 15, element: 4
23
sum: 1, element: 2
sum: 3, element: 3
sum: 6, element: 4
10
  • foldRight(), reduceRight(): apply a function to elements in the reverse order
  • foldIndexed(), reduceIndexed()
  • foldRightIndexed(), reduceRightIndexed()

reduce 명령들은 컬렉션이 비어있을 때 예외를 던지는데, 대신 null을 받고자 할 경우 *OrNull() 함수를 호출한다.(e.g. reduceOrNull())

runningFold(), runningReduce(): 중간 결과들을 모두 저장한 컬렉션을 반환한다.

val numbers = listOf(0, 1, 2, 3, 4, 5)
val runningFoldSum = numbers.runningFold(10) { sum, item -> sum + item }
val runningReduceSum = numbers.runningReduce { sum, item -> sum + item }
println(runningFoldSum)
println(runningReduceSum)
[10, 10, 11, 13, 16, 20, 25]
[0, 1, 3, 6, 10, 15]
  • runningFoldIndexed(), runningReduceIndexed()