songining
Published 2023. 2. 21. 16:45
[Kotlin] associateBy, groupBy Language/Kotlin

collections API ์ค‘ ํ•˜๋‚˜๋กœ ์ปฌ๋ ‰์…˜์„ Map ํ˜•ํƒœ๋กœ ๋ณ€ํ˜•์‹œ์ผœ์ฃผ๋Š” API ์ด๋‹ค. 

associateBy ํ•จ์ˆ˜์™€ groupBy ํ•จ์ˆ˜๋Š” ์ง€์ •๋œ key์— ์˜ํ•ด ์ธ๋ฑ์‹ฑ๋œ ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋กœ๋ถ€ํ„ฐ Map์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

associateBy

public inline fun <T, K> Iterable<T>.associateBy(keySelector: (T) -> K): Map<K, T> {
    val capacity = mapCapacity(collectionSizeOrDefault(10)).coerceAtLeast(16)
    return associateByTo(LinkedHashMap<K, T>(capacity), keySelector)
}

๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” T๋ฅผ ์ „๋‹ฌํ•˜๊ณ  key๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋žŒ๋‹คํ•จ์ˆ˜ keySelector๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. 

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ keySelector๋ฅผ key๋กœ, List์˜ ์ธ์ž๋ฅผ value๋กœ Map<K,V>๋ฅผ ๋งŒ๋“ค์–ด ๋ฆฌํ„ดํ•œ๋‹ค. 

 

์˜ˆ์‹œ

fun main() { 
	val statuses = listOf(Status("Running"), Status("Pending"), Status("Failed"))
	private val mapping = statuses.associateBy(Phase::value)
	// ๊ฒฐ๊ณผ : {Running=Status("Running"), Pending=Status("Pending"), Failed=Status("Failed")}
}

 

groupBy

public inline fun <T, K> Array<out T>.groupBy(keySelector: (T) -> K): Map<K, List<T>> {
    return groupByTo(LinkedHashMap<K, MutableList<T>>(), keySelector)
}

List๋ฅผ Map ํ˜•ํƒœ๋กœ ๋ณ€ํ˜•์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

associateBy์™€ ๋‹ฌ๋ฆฌ, key๊ฐ€ ์ค‘๋ณต๋˜์–ด๋„ value๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’ ์œ ์‹ค์ด ์—†๋‹ค. (associateBy๋Š” key ์ค‘๋ณต์‹œ, ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ์›์†Œ๊ฐ€ value๊ฐ€ ๋œ๋‹ค.)

 

์˜ˆ์‹œ

fun main() { 
	val statuses = listOf(Status("Running"), Status("Pending"), Status("Failed"))
	private val mapping = statuses.groupBy(Phase::value)
	// ๊ฒฐ๊ณผ : {Running=[Status("Running")], Pending=[Status("Pending")], Failed=[Status("Failed")]}
}

value๊ฐ€ list๋กœ ๋ฌถ์—ฌ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ 2๊ฐœ๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด ๊ฐ๊ฐ์€ key์™€ value์ด๋‹ค.

'Language > Kotlin' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin ์œ„์ž„ ํ”„๋กœํผํ‹ฐ Observable  (0) 2023.09.05
Kotlin Coroutine Context, Coroutine Builder  (0) 2022.11.01
Kotlin inline fun, reified  (0) 2022.10.28