Kotlinでは、リストの中から特定の条件に基づいて 重複を削除 したい場合に、distinctBy
という便利な関数が用意されています。通常の distinct
ではリスト全体の重複を削除するのに対し、distinctBy
を使うと 特定のプロパティだけを比較対象にして重複を排除 できます。
distinctByの基本的な使い方
例えば、数値リストの 偶奇を基準に重複を削除 したい場合、次のように書けます。
Kotlin
val numbers = listOf(1, 2, 3, 4, 5, 6)
val distinctNumbers = numbers.distinctBy { it % 2 }
println(distinctNumbers) // 出力: [1, 2]
1, 3, 5
はすべて奇数(it % 2 == 1
)なので最初の1
だけが残る2, 4, 6
はすべて偶数(it % 2 == 0
)なので最初の2
だけが残る
distinctByの活用例
1. オブジェクトリストの重複をプロパティ単位で削除
Kotlin
data class User(val id: Int, val name: String)
val users = listOf(
User(1, "田中"),
User(2, "佐藤"),
User(1, "鈴木"),
User(3, "高橋")
)
val uniqueUsers = users.distinctBy { it.id }
println(uniqueUsers)
// 出力: [User(id=1, name=田中), User(id=2, name=佐藤), User(id=3, name=高橋)]
id
を基準に重複を削除 し、最初に出現したオブジェクトが残ります。
2. リスト内のデータをユニークなキーごとに整理
Kotlin
val words = listOf("apple", "banana", "avocado", "blueberry", "cherry")
val uniqueByFirstLetter = words.distinctBy { it.first() }
println(uniqueByFirstLetter)
// 出力: [apple, banana, cherry]
頭文字を基準にして、最初に出現した単語だけを残せます。
3. 日付リストを「日付単位」で一意にする
Kotlin
import java.time.LocalDate
data class Event(val name: String, val date: LocalDate)
val events = listOf(
Event("会議", LocalDate.of(2025, 2, 1)),
Event("ランチ", LocalDate.of(2025, 2, 1)),
Event("打ち合わせ", LocalDate.of(2025, 2, 2))
)
val uniqueEvents = events.distinctBy { it.date }
println(uniqueEvents)
// 出力: [Event(name=会議, date=2025-02-01), Event(name=打ち合わせ, date=2025-02-02)]
最初の date
に基づいて一意なイベントだけを取得できます。
distinctByを使うメリット
- リストの特定のプロパティに基づいて重複を削除できる
- 単純な
distinct
よりも柔軟にデータを整理できる - データベースの一意制約のような動作をコード上で実現できる
リストのデータをユニークな基準で整理したい場合は、ぜひ distinctBy
を活用してみてください!