코틀린 컬렉션 함수 - groupBy, reduce, fold(reduce와 fold 차이)

상상코딩·2021년 12월 14일
0

코틀린

목록 보기
1/5

.reduce

컬렉션의 값들을 누적해서 계산하거나, 순서대로 합쳐서 결과물을 내고 싶을 때 사용!! accumulate!

컬렉션이 empty인 경우 exception 반환하므로 empty일까 걱정되는 경우에는 reduceOrNull를 사용하면 됨.

val strings = listOf("a", "b", "c", "d")
println(strings.reduce { acc, string -> acc + string }) // abcd
println(strings.reduceIndexed { index, acc, string -> acc + string + index }) // ab1c2d3

emptyList<Int>().reduce { _, _ -> 0 } //  will fail -> 이런경우 reduceOrNull을 사용하면 exception없이 사용할 수 있음(null반환)

.fold

컬렉션의 값들을 누적해서 계산하거나, 순서대로 합쳐서 결과물을 내고 싶을 때 사용!! accumulate!

val numbers = listOf<Int>(1,2,3)
val sumFromTen = numbers.fold(1) { total, num -> total + num*2 } // ((0 + 1*2) + 2*2) + 3*2 = 12
val sum = numbers.reduce { total, num -> total + num*2 } // (1 + 2*2) + 3*2 = 11

reduce랑 뭐가 다른걸까!!?!!

fold: 초기값 있음. 수행할 람다를 모든 컬렉션 요소에 적용함.
reduce: 초기값 없음. 컬렉션의 첫 요소는 operation을 적용하지 않음.

결론:
컬렉션이 empty일 확률이 있다면 초기값이 있는 fold를 쓰거나 reduceOrNull를 사용하자.
첫번째 요소에는 operation적용을 안할거라면 reduce 쓰자.

.groupBy

컬렉션의 값들을 어떤 키에 의해 그룹핑 -> map을 반환!

val words = listOf("a", "abc", "ab", "def", "abcd")
val byLength = words.groupBy { it.length }

println(byLength.keys) // [1, 3, 2, 4]
println(byLength.values) // [[a], [abc, def], [ab], [abcd]]

val mutableByLength: MutableMap<Int, MutableList<String>> = words.groupByTo(mutableMapOf()) { it.length }
// same content as in byLength map, but the map is mutable
println("mutableByLength == byLength is ${mutableByLength == byLength}") // true

예제!

profile
히히낙낙

0개의 댓글