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



























