Collection 裡的資料多了後,有時不免要對其中的內容做檢查,方便做邏輯判斷。在這個章節裡,就要介紹一些跟檢查有關的 Collection 操作。
常見的一個情境是想要檢查一個 Collection 裡是否有「包含」某個元素?這個 method 在 Kotlin 裡取名為 contains()
,傳一個要檢查的元素,若 Collection 裡有任一元素跟檢查元素是 equals()
則回傳 true、反之回傳 false。
val numbers = listOf("one", "two", "three", "four", "five", "six")
numbers.contains("four") // true
值得一提的是,contains()
這種用法其實跟 in
關鍵字的用法相同,所以上面這個例子可以改寫成更簡潔、更像英文語句的寫法。
val numbers = listOf("one", "two", "three", "four", "five", "six")
"four" in numbers // true
想要一次檢查多個元素也沒問題,改用 containsAll()
即可。不過要稍加注意的是,containsAll()
要全部的檢查元素都存在才會回傳 true 喔!
val numbers = listOf("one", "two", "three", "four", "five", "six")
numbers.containsAll(listOf("four", "two")) // true
numbers.containsAll(listOf("one", "zero")) // false
有時想要檢查的是 Collection 是否為空?或是有值?這時可以很直覺的用 isEmpty()
和 isNotEmpty()
兩個 method。這樣你就不需要土炮自己寫 collection.size == 0
這種程式碼了。(就算你寫了,IntelliJ IDEA 也會提示你可以改用 isEmpty()
)
val numbers = mutableListOf("one", "two", "three", "four", "five", "six")
numbers.isEmpty() // false
numbers.clear()
numbers.isEmpty() // true
numbers.addAll(listOf("one", "two", "three"))
numbers.isEmpty() // false
numbers.isNotEmpty() // true
val empty = emptyList<String>()
empty.isEmpty() // true
empty.isNotEmpty() // false
跟 isEmpty()
和 isNotEmpty()
在概念上有點類似,但語意稍有不同的是 any()
及 none()
。假如 Collection 存在任何元素的話,any()
就會回傳 true,反之回傳 false;none()
則是相反的語意,行為跟 any()
也相反。
val numbers = listOf("one", "two", "three", "four")
val empty = emptyList<String>()
numbers.any() // true
empty.any() // false
numbers.none() // false
empty.none() // true
any()
與 none()
也可以彈性的傳入 Lambda 做為條件。若是 Collection 裡有任一元素通過 Lambda 的條件,any()
就會回傳 true。若 Collection 裡沒有任一元素通過 Lambda 條件的話,none()
就會回傳 true。
val numbers = listOf("one", "two", "three", "four")
numbers.any { it.endsWith("e") } // true
numbers.none { it.endsWith("a") } // true
而 all()
則是檢查 Collection 裡是否所有元素都符合 Lambda 的條件,全符合的話就會回傳 true。不過要注意 Vacuous Truth,也就是說,假如對一個空的 Collection 使用 all()
檢查,則一樣會回傳 true。
numbers.all { it.endsWith("e") } // false
emptyList<Int>().all { it > 5 } // true
這個章節討論幾個常用的檢查操作,這些 method 可以省下許多手動處理的動作。同樣地,為了一覽這些 API 在不同 Collection 上的行為,以下用表格來整理本章所討論到的 method:
行為 | Array | List | Set | Map | |
---|---|---|---|---|---|
contains() | 是否包含指定元素 | v | v | v | v |
containsAll() | 是否包含所有元素 | x | v | v | x |
isEmpty() | 是否為空 | v | v | v | v |
isNotEmpty() | 是否不為空 | v | v | v | v |
any() | 任一元素符合 | v | v | v | v |
none() | 無元素符合 | v | v | v | v |
all() | 所有元素符合 | v | v | v | v |