distinctByでリストの重複を簡単に削除

Kotlin
記事内に広告が含まれる場合があります

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を使うメリット

  1. リストの特定のプロパティに基づいて重複を削除できる
  2. 単純な distinct よりも柔軟にデータを整理できる
  3. データベースの一意制約のような動作をコード上で実現できる

リストのデータをユニークな基準で整理したい場合は、ぜひ distinctBy を活用してみてください!

タイトルとURLをコピーしました