iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0

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

參考資料


上一篇
第十五天:Collection 操作之排序
下一篇
第十七天:Collection 操作之搜尋
系列文
新手也能懂的 Kotlin Collection 賞玩門道31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言