Kotlin去重黑科技:distinct的花式玩法大公開!
當(dāng)你的數(shù)據(jù)集體"撞衫"怎么辦?
你整理了一筐水果,結(jié)果發(fā)現(xiàn)蘋果混進去了三次;你統(tǒng)計用戶訂單,結(jié)果重復(fù)數(shù)據(jù)像復(fù)制粘貼一樣出現(xiàn)...這時候就需要請出Kotlin
家族的"去重小能手"—distinct
!它能像篩子一樣過濾重復(fù)項,還你干凈整潔的數(shù)據(jù)集!
初識distinct:基礎(chǔ)去重三連招
第一式:簡單粗暴去重法
fun main() {
// 水果采購清單(不小心掃了三次蘋果)
val fruits = listOf("??", "??", "??", "??", "??", "??", "??",)
// 使用魔法咒語 distinct!
val uniqueFruits = fruits.distinct()
println("原始清單:$fruits") // [??, ??, ??, ??, ??, ??, ??]
println("去重結(jié)果:$uniqueFruits") // [??, ??, ??, ??]
}
效果說明:就像超市掃碼器遇到重復(fù)商品會"滴"一聲跳過,distinct
會保留每種元素的第一次出現(xiàn),后續(xù)重復(fù)都會被無情過濾!
第二式:數(shù)組特攻版
fun main() {
// 員工工號數(shù)組(有兩個007重復(fù))
val employeeIds = arrayOf(101, 007, 102, 007, 103) // 改用普通數(shù)組
// 正確姿勢:先轉(zhuǎn)為List再施法
val uniqueIds = employeeIds.toList().distinct()
println("原始工號:${employeeIds.contentToString()}") // [101, 7, 102, 7, 103]
println("去重結(jié)果:$uniqueIds") // [101, 7, 102, 103]
}
注意:數(shù)組需要先轉(zhuǎn)為List
才能使用distinct
哦~
? 普通數(shù)組(Array<T>類型)需要先通過toList()
轉(zhuǎn)換
? 基本類型數(shù)組(如IntArray
)可直接使用distinct()
,因為Kotlin
偷偷給它們加了超能力?
第三式:對象精準(zhǔn)去重術(shù)
// 社交媒體好友數(shù)據(jù)類
dataclassSocialFriend(
val nickname: String,
val account: String
)
fun main() {
// 好友列表(兩個相同賬號的重復(fù)關(guān)注)
val friends = listOf(
SocialFriend("碼農(nóng)小明", "coder_123"),
SocialFriend("產(chǎn)品經(jīng)理小王", "pm_007"),
SocialFriend("測試小美", "coder_123") // 重復(fù)賬號!
)
// 按賬號去重的魔法
val realFriends = friends.distinctBy { it.account }
println("真實好友:$realFriends")
// 只會保留第一個"coder_123"對應(yīng)的對象
}
小貼士:distinctBy
就像智能過濾器,可以指定對象的某個特征作為去重依據(jù)!
高階玩法:這些冷知識你知道嗎?
冷知識1:去重也要講武德
distinct
會嚴(yán)格保持元素出現(xiàn)的原始順序,就像排隊買奶茶時,黃牛插隊會被識別出來踢出去,但其他人的順序不變
冷知識2:超能力組合技
fun main() {
// 混合類型列表(數(shù)字和字符串)
val mixList = listOf(1, "1", 2, "2", 3, "3")
// 先過濾字符串再轉(zhuǎn)換數(shù)字
val numbers = mixList.filterIsInstance<Int>()
.distinct()
.sortedDescending()
println("混合處理結(jié)果:$numbers") // [3, 2, 1]
}
組合技解析:distinct
可以和filter
、map
等操作鏈?zhǔn)秸{(diào)用,實現(xiàn)復(fù)雜的數(shù)據(jù)清洗流程!
避坑指南:這些情況要注意!
1. 對象比較陷阱:普通對象默認(rèn)比較內(nèi)存地址,要用data class
或重寫equals
方法
2. 大小寫敏感:"Apple"和"apple"會被認(rèn)為是不同元素,需要預(yù)處理統(tǒng)一大小寫
3. 性能問題:超大數(shù)據(jù)集建議使用toSet()
轉(zhuǎn)換,效率更高
實戰(zhàn)演練:做個智能購物車
// 購物車商品類
dataclassCartItem(
val sku: String, // 商品唯一編號
val name: String,
var quantity: Int
)
fun main() {
// 模擬用戶重復(fù)添加商品
val cart = listOf(
CartItem("1001", "無線耳機", 1),
CartItem("1002", "充電寶", 2),
CartItem("1001", "無線耳機", 1) // 手抖重復(fù)添加
)
// 終極去重方案
val cleanCart = cart.distinctBy { it.sku }
.map { it.copy(quantity = 1) } // 重置數(shù)量
println("智能購物車:$cleanCart")
}
運行結(jié)果:自動合并重復(fù)商品,并重置數(shù)量為1,有效防止重復(fù)下單!
掌握了這些distinct
的妙用,從此告別重復(fù)數(shù)據(jù)煩惱!如果還有其他Kotlin
黑科技想了解,歡迎留言告訴我~ ??