Kotlinには、コレクション(リスト、セット、マップなど)を扱うための便利な拡張関数が数多く用意されています。その中でもanyとallは、コレクションの要素が特定の条件を満たしているかどうかを手軽にチェックできる機能です。
ここでは、それぞれの使い方や応用例を紹介していきます。
anyの基本的な使い方
anyとは
anyは、コレクション内に「条件を満たす要素が1つでも存在するか」を確認するときに使われます。返り値は真偽値(Boolean)です。
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
となります。
fun main() {
val emptyList = emptyList<Int>()
println(emptyList.any()) // false
}
emptyList.any()
は、中に何も要素がないのでfalse
allの基本的な使い方
allとは
allは、コレクション内の「すべての要素が特定の条件を満たすかどうか」をチェックする関数です。こちらも結果は真偽値が返されます。
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(充足的真)」と呼ばれる考え方に基づくものです。
fun main() {
val emptyList = emptyList<Int>()
println(emptyList.all { it >= 1 }) // true
}
emptyList.all
の判定式に違反する要素が存在しないためtrue
便利な活用例
1. フォーム入力チェック
ユーザーが入力した値が一つでも空欄であればエラーにしたい、というケースではanyを使えます。
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を活用できます。
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を組み合わせる
複雑な条件分岐が必要な場合、anyとallを組み合わせることで、可読性の高いコードを書くことができます。
たとえば、以下は「10以上の数値が1つでもあるか」かつ「すべての要素が正の数か」を同時にチェックしています。
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("条件を満たしていません")
}
}
注意点
- 大規模コレクションへの適用
- anyやallは基本的に先頭から順に要素を検証します。大量の要素を含むコレクションに対して何度も呼び出すと、パフォーマンスに影響が出る場合があります。
- 空コレクションへの挙動
- any →
false
- all →
true
- 知らずに使うと、意図しない結果になることがあります。空の場合の処理を別途設計するか、先に
isEmpty()
をチェックするのも一つの方法です。
- any →
- 複雑な条件は分割して書く
- 条件式が長くなると可読性が落ちます。分割して変数にするなど、分かりやすくする工夫が大切です。
まとめ
Kotlinのanyとallを使えば、コレクション内の要素が特定の条件を満たすかを簡潔に確認できます。
- any: 要素の中にひとつでも条件を満たすものがあるか
- all: すべての要素が条件を満たすか
特に入力フォームのバリデーションやスコア判定など、日常的な処理で頻繁に活用できます。空コレクション時の挙動や複雑な条件の書き方には気をつけながら、ぜひプロジェクトで役立ててみてください。