【Kotlin入門】anyとallでコレクションを簡単チェック!

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

Kotlinには、コレクション(リスト、セット、マップなど)を扱うための便利な拡張関数が数多く用意されています。その中でもanyallは、コレクションの要素が特定の条件を満たしているかどうかを手軽にチェックできる機能です。
ここでは、それぞれの使い方や応用例を紹介していきます。


anyの基本的な使い方

anyとは

anyは、コレクション内に「条件を満たす要素が1つでも存在するか」を確認するときに使われます。返り値は真偽値(Boolean)です。

Kotlin
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    // 2以上の要素が含まれているかどうかチェック
    val hasElementOverOne = numbers.any { it >= 2 }
    println(hasElementOverOne) // true
}

上記の例では、numbersに2以上の要素(2, 3, 4, 5)が含まれているので、anyの結果はtrueとなります。
もし、まったく条件を満たす要素が存在しなければfalseになります。


空のコレクションへの適用

空のリストやセットに対してanyを呼び出すと、必ずfalseになります。
例えば、空リストに対して「何らかの要素が存在するかどうか」をanyで確認しても、一切要素がないためfalseとなります。

Kotlin
fun main() {
    val emptyList = emptyList<Int>()
    println(emptyList.any()) // false
}
  • emptyList.any() は、中に何も要素がないのでfalse

allの基本的な使い方

allとは

allは、コレクション内の「すべての要素が特定の条件を満たすかどうか」をチェックする関数です。こちらも結果は真偽値が返されます。

Kotlin
fun main() {
    val scores = listOf(80, 90, 85, 70)
    // 全てのスコアが60以上かどうかチェック
    val allOverSixty = scores.all { it >= 60 }
    println(allOverSixty) // true
}

上記の例では、すべての要素(80, 90, 85, 70)が60以上なので、allの結果はtrueとなります。
一つでも条件を満たさない要素があればfalseが返されます。


空のコレクションへの適用

空のリストやセットでallを呼び出すと、要素が一つもないため「違反する要素が見つからない」という解釈でtrueになります。これは「 vacuously true(充足的真)」と呼ばれる考え方に基づくものです。

Kotlin
fun main() {
    val emptyList = emptyList<Int>()
    println(emptyList.all { it >= 1 }) // true
}
  • emptyList.all の判定式に違反する要素が存在しないためtrue

便利な活用例

1. フォーム入力チェック

ユーザーが入力した値が一つでも空欄であればエラーにしたい、というケースではanyを使えます。

Kotlin
fun isFormValid(inputs: List<String>): Boolean {
    // 空文字("")があるとfalseを返す
    return !inputs.any { it.isEmpty() }
}

fun main() {
    val formInputs = listOf("John", "Doe", "john.doe@example.com")
    println(isFormValid(formInputs)) // true
}
  • any { it.isEmpty() } は「空文字の要素があるかどうか」をチェック。
  • それを否定演算子!で反転することで「すべて埋まっているかどうか」に変換しています。

2. 全員合格かどうか

全員が合格点以上かどうかを一括チェックしたい場合はallを活用できます。

Kotlin
fun allPassed(scores: List<Int>, passMark: Int): Boolean {
    return scores.all { it >= passMark }
}

fun main() {
    val scores = listOf(80, 92, 75, 100)
    println(allPassed(scores, 60)) // true
    println(allPassed(scores, 90)) // false
}
  • 60点以上なら全員合格 → true
  • 90点以上なら一部の人は満たさない → false

anyとallを組み合わせる

複雑な条件分岐が必要な場合、anyallを組み合わせることで、可読性の高いコードを書くことができます。
たとえば、以下は「10以上の数値が1つでもあるか」かつ「すべての要素が正の数か」を同時にチェックしています。

Kotlin
fun main() {
    val list = listOf(1, 5, 12, 3)
    val hasOverTen = list.any { it >= 10 }
    val allPositive = list.all { it > 0 }

    if (hasOverTen && allPositive) {
        println("10以上の数値が含まれており、すべて正の数です")
    } else {
        println("条件を満たしていません")
    }
}

注意点

  1. 大規模コレクションへの適用
    • anyやallは基本的に先頭から順に要素を検証します。大量の要素を含むコレクションに対して何度も呼び出すと、パフォーマンスに影響が出る場合があります。
  2. 空コレクションへの挙動
    • any → false
    • all → true
    • 知らずに使うと、意図しない結果になることがあります。空の場合の処理を別途設計するか、先にisEmpty()をチェックするのも一つの方法です。
  3. 複雑な条件は分割して書く
    • 条件式が長くなると可読性が落ちます。分割して変数にするなど、分かりやすくする工夫が大切です。

まとめ

Kotlinのanyallを使えば、コレクション内の要素が特定の条件を満たすかを簡潔に確認できます。

  • any: 要素の中にひとつでも条件を満たすものがあるか
  • all: すべての要素が条件を満たすか

特に入力フォームのバリデーションやスコア判定など、日常的な処理で頻繁に活用できます。空コレクション時の挙動や複雑な条件の書き方には気をつけながら、ぜひプロジェクトで役立ててみてください。

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