ภาพรวม
Kotlin มีฟังก์ชันหลายตัวสำหรับแปลง List ให้กลายเป็น Map (Key-Value) เลือกใช้ตามรูปแบบข้อมูลและความต้องการ
ข้อมูลตัวอย่าง
data class Subject(val name: String, val priority: String)
val subjects = listOf(
Subject("Java", "1"),
Subject("Kotlin", "2"),
Subject("C", "3")
)
วิธีที่ 1: associate() - ยืดหยุ่นที่สุด
val map = subjects.associate { it.priority to it.name }
// {1=Java, 2=Kotlin, 3=C}
// ใช้งาน: สร้าง Pair เองได้ตามตอง
val map2 = subjects.associate { it.name to it.priority }
// {Java=1, Kotlin=2, C=3}
วิธีที่ 2: associateBy() - Key Selector แยกจาก Value Selector
val map = subjects.associateBy(
keySelector = { it.priority }, // Key
valueTransform = { it.name } // Value
)
// {1=Java, 2=Kotlin, 3=C}
// ถ้า Value ใช้ Object ทั้งตัว
val mapObj = subjects.associateBy({ it.priority }) { it }
// {1=Subject(name=Java, priority=1), ...}
วิธีที่ 3: toMap() หลัง map()
val map = subjects.map { it.priority to it.name }.toMap()
// {1=Java, 2=Kotlin, 3=C}
วิธีที่ 4: associateWith() - Key คงที่ Value แปลง
// Key ใช้ name, Value แปลงจาก priority
val map = subjects.associateWith { it.priority }
// {Java=1, Kotlin=2, C=3}
การจัดการ Duplicate Key
val withDup = listOf(
Subject("Java", "1"),
Subject("Kotlin", "1"), // Duplicate key "1"
Subject("C", "3")
)
// associate/associateBy: ตัวหลังทับตัวหน้า (Last wins)
val map = withDup.associateBy({ it.priority }) { it.name }
// {1=Kotlin, 3=C} <- "Java" ถูกทับ
// ถ้าต้องการรวมค่า (Merge)
val merged = withDup.groupBy({ it.priority }) { it.name }
// {1=[Java, Kotlin], 3=[C]} -> Map>
ตารางเปรียบเทียบ
| Function | ใช้เมื่อ | Duplicate Key |
|---|---|---|
| associate | ต้องการสร้าง Pair เองทั้ง Key/Value | Last wins |
| associateBy | แยก Key Selector และ Value Transform | Last wins |
| map + toMap | ทำ Transform แล้วค่อย toMap | Last wins |
| associateWith | Key ใช้ Property ตรงๆ Value แปลง | Last wins |
| groupBy | ต้องการรวมค่าที่ Key ซ้ำกัน | กลายเป็น List |
Performance Note
- ทั้งหมดเป็น O(n) - วนลูปครั้งเดียว
associateและassociateByมี Overhead น้อยกว่าmap().toMap()(สร้าง Intermediate List)- สำหรับ List ใหญ่ ควรใช้
associateหรือassociateByโดยตรง