filter、filterNot、partition
述語ベースの関数を使って要素を分割・選択します。
「filter、filterNot、partition」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
選択操作
filter は述語に一致する要素を残します。filterNot は一致しない要素を残します。partition はコレクションを一度に 2 つのリストへ分割します。
filter の基本
filter { ... } は、述語が true になる要素だけを含む新しいリストを返します。
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val evens = nums.filter { it % 2 == 0 }
println(evens) // [2, 4, 6]
}filterNot
filterNot { ... } は逆の処理です。述語が false になる要素を残します。述語を反転させた場合と同じ結果ですが、意図がより明確になります。
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val odds = nums.filterNot { it % 2 == 0 }
println(odds) // [1, 3, 5]
}partition
partition は Pair を返します。一致する要素が先に入り、一致しない要素が後に入ります。データを 2 回走査せずに済みます。
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val (evens, odds) = nums.partition { it % 2 == 0 }
println("evens=$evens odds=$odds")
}データクラスでの partition
レコードのリストを 1 回の走査で 2 つのグループに分割します。
data class User(val name: String, val active: Boolean)
fun main() {
val users = listOf(User("Ada", true), User("Ben", false), User("Cal", true))
val (active, inactive) = users.partition { it.active }
println("active=${active.map { it.name }}")
println("inactive=${inactive.map { it.name }}")
}filterIndexed
述語にはインデックスと値の両方が渡されます。位置が重要な場合に便利です。
fun main() {
val nums = listOf(10, 20, 30, 40, 50)
val every2nd = nums.filterIndexed { i, _ -> i % 2 == 0 }
println(every2nd) // [10, 30, 50]
}filterIsInstance
特定の型の要素だけを残します。内部ではスマートキャストが利用できます。
fun main() {
val mixed: List<Any> = listOf(1, "hello", 2.0, "world", 3)
val onlyStrings = mixed.filterIsInstance<String>()
println(onlyStrings) // [hello, world]
}filterNotNull
null 許容型のリストから null 要素を取り除き、null でない要素のリストを返します。
fun main() {
val mixed: List<String?> = listOf("a", null, "b", null, "c")
val nonNull = mixed.filterNotNull()
println(nonNull) // [a, b, c]
}filter と map の連結
filter と map を組み合わせて、選択と変換を行うパイプラインを作成します。
data class Product(val name: String, val price: Double, val inStock: Boolean)
fun main() {
val products = listOf(
Product("Pen", 1.0, true),
Product("Book", 12.0, false),
Product("Lamp", 25.0, true)
)
val availableNames = products.filter { it.inStock }.map { it.name }
println(availableNames) // [Pen, Lamp]
}明確さのために filterNot で否定
場合によっては、filterNot { it.isActive } のほうが filter { !it.isActive } より読みやすくなります。
data class Task(val title: String, val done: Boolean)
fun main() {
val tasks = listOf(Task("Email", true), Task("Lunch", false), Task("Code", true))
val pending = tasks.filterNot { it.done }
println(pending) // [Task(title=Lunch, done=false)]
}partition はリストを返す
partition が返す Pair には、通常の List が 2 つ含まれます。分割代入するか、.first / .second からアクセスしてください。
fun main() {
val nums = (1..10).toList()
val result = nums.partition { it > 5 }
println("above 5: ${result.first}")
println("below 6: ${result.second}")
}partition と 2 回の filter 呼び出し
両方の部分集合が必要な場合、partition のほうが高速です。2 回ではなく 1 回の走査で済むためです。
fun main() {
val nums = (1..10).toList()
// Two passes:
val a = nums.filter { it > 5 }
val b = nums.filter { it <= 5 }
// One pass:
val (c, d) = nums.partition { it > 5 }
println("$a $b")
println("$c $d")
}クイックチェック
一致する要素と一致しない要素の両方を、1 回の走査で返す関数はどれですか?
まとめ
filter は一致する要素を選択し、filterNot は一致しない要素を選択し、partition は両方のグループを 1 回の走査で返します。型で要素を絞り込むには filterIsInstance を、null を取り除くには filterNotNull を使用してください。map と連結して、選択と変換を行うこともできます。
よくある質問
「filter、filterNot、partition」レッスンは無料ですか?
はい。「filter、filterNot、partition」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「filter、filterNot、partition」で何を学びますか?
述語ベースの関数を使って要素を分割・選択します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「filter、filterNot、partition」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- mapとflatMap:すべての要素を変換する
- filter、filterNot、partition
- fold、reduce、runningFold
- パイプラインのチェーンとSequenceによる中間リストの回避