当前位置:   article > 正文

kotlin 中 Collection 相关操作

kotlin collection filter

filter

filter 函数让您可以过滤集合。它将过滤谓词作为lambda参数。谓词应用于每个元素。使谓词为true的元素将在结果集合中返回。

简单来说就是在filter 函数中设置你需要集合满足的条件,然后返回满足条件的元素。

eg:

  1. fun filterTest() {
  2. val numbers = listOf(1, 2, 3, 4, 5, 6, -1, -3, -4)
  3. val positive = numbers.filter {
  4. it > 0
  5. }
  6. println(positive.toString())
  7. val negatives = numbers.filter { a -> a < 0 }
  8. println(negatives.toString())
  9. }
  10. 复制代码

输出结果:

  1. [1, 2, 3, 4, 5, 6]
  2. [-1, -3, -4]
  3. 复制代码

map

通过映射扩展功能,您可以将转换应用于集合中的所有元素。它将变压器功能作为lambda参数。

eg:

  1. fun mapTest() {
  2. val numbers = listOf(1, 2, 3, 4, 5, 6, -1, -3, -4)
  3. val map = numbers.map {
  4. it * 3
  5. }
  6. println(map.toString())
  7. }
  8. 复制代码

打印结果:

  1. [3, 6, 9, 12, 15, 18, -3, -9, -12]
  2. 复制代码

any, all, none

作用:检查是否存在与给定条件匹配的集合元素。

any

如果集合包含至少一个与给定条件匹配的元素,则函数any返回true。

eg:

  1. fun anyTest() {
  2. val numbers = listOf(1, -2, 3, -4, 5, -6) // 1
  3. val anyNegative = numbers.any { it < 0 } // 2
  4. val anyGT6 = numbers.any { it > 6 }
  5. println("Is there any number less than 0: $anyNegative")
  6. println("Is there any number greater than 6: $anyGT6")
  7. }
  8. 复制代码

输出结果:

  1. Is there any number less than 0: true
  2. Is there any number greater than 6: false
  3. 复制代码
all

如果集合中的所有元素都与给定的条件匹配,则函数all返回true。

eg:

  1. fun allTest() {
  2. val numbers = listOf(1, -2, 3, -4, 5, -6) // 1
  3. val allEven = numbers.all { it % 2 == 0 } // 2
  4. val allLess6 = numbers.all { it < 6 }
  5. println("All numbers are even: $allEven")
  6. println("All numbers are less than 6: $allLess6")
  7. }
  8. 复制代码

输出结果:

  1. All numbers are even: false
  2. All numbers are less than 6: true
  3. 复制代码
none

如果没有与集合中给定条件匹配的元素,则函数none返回true。

eg:

  1. fun noneTest() {
  2. val numbers = listOf(1, -2, 3, -4, 5, -6) // 1
  3. val allEven = numbers.none { it % 2 == 1 } // 2
  4. val allLess6 = numbers.none { it > 6 }
  5. println("All numbers are even: $allEven")
  6. println("No element greater than 6: $allLess6")
  7. }
  8. 复制代码

输出结果:

  1. All numbers are even: false
  2. No element greater than 6: true
  3. 复制代码

find findLast fisrt last

findfindLast函数返回与给定条件匹配的第一个或最后一个集合元素。如果没有这样的元素,函数返回null。

例子:find findLast

  1. fun findTest() {
  2. val words = listOf("Lets", "find", "something", "in", "collection", "somehow") // 1
  3. val first = words.find { it.startsWith("some") } // 2
  4. val last = words.findLast { it.startsWith("some") } // 3
  5. val nothing = words.find { it.contains("nothing") } // 4
  6. println("The first word starting with \"some\" is $first")
  7. println("The last word starting with \"some\" is $last")
  8. println("The first word containing \"nothing\" is $nothing")
  9. }
  10. 复制代码

输出结果:

  1. The first word starting with "some" is something
  2. The last word starting with "some" is somehow
  3. The first word containing "nothing" is null
  4. 复制代码

注意:它输出的是满足条件的以一个或者最后一个,不是集合中的第一个或最后一个

fisrt 和 **last ** 返回集合第一个和最后一个元素,也可以为其添加条件

例子: fisrt last

  1. val numbers = listOf(1, -2, 3, -4, 5, -6) // 1
  2. val first = numbers.first() // 2
  3. val last = numbers.last() // 3
  4. val firstEven = numbers.first { it % 2 == 0 } // 4
  5. val lastOdd = numbers.last { it % 2 != 0 } // 5
  6. 复制代码

输出结果:

  1. Numbers: [1, -2, 3, -4, 5, -6]
  2. First 1, last -6, first even -2, last odd 5
  3. 复制代码

count

返回集合个数,或者满足一定条件的元素个数

  1. val numbers = listOf(1, -2, 3, -4, 5, -6) // 1
  2. val totalCount = numbers.count() // 2
  3. val evenCount = numbers.count { it % 2 == 0 } // 3
  4. 输出结果:
  5. Total number of elements: 6
  6. Number of even elements: 3
  7. 复制代码

partition

函数的功能是把原来的集合根据给定的条件拆分成两个列表,满足条件

  1. fun partitionTest() {
  2. val numbers = listOf(1, -2, 3, -4, 5, -6) // 1
  3. val evenOdd = numbers.partition { it % 2 == 0 } // 2
  4. val (positives, negatives) = numbers.partition { it > 0 } // 3
  5. println("奇偶:$evenOdd")
  6. println("偶数:${evenOdd.first}")
  7. println("奇数 :${evenOdd.second}")
  8. println("positives : $positives")
  9. println("negatives : $negatives")
  10. }
  11. 复制代码

输出结果:

  1. 奇偶:([-2, -4, -6], [1, 3, 5])
  2. 偶数:[-2, -4, -6]
  3. 奇数 :[1, 3, 5]
  4. positives : [1, 3, 5]
  5. negatives : [-2, -4, -6]
  6. 复制代码

associateBy, groupBy

函数associateBy和groupBy构建来自由指定键索引的集合的元素的映射。key在keySelector参数中定义。

您还可以指定可选的valueSelector来定义将存储在map元素值中的内容。

区别

associateBy和groupBy之间的区别在于它们如何使用相同的键处理对象:

  • associateBy使用最后一个合适的元素作为值。

  • groupBy构建所有合适元素的列表并将其放入值中。

  1. fun associateTest() {
  2. data class Person(val name: String, val city: String, val phone: String) //1
  3. val people = listOf( // 2
  4. Person("John", "Boston", "+1-888-123456"),
  5. Person("Sarah", "Munich", "+49-777-789123"),
  6. Person("Svyatoslav", "Saint-Petersburg", "+7-999-456789"),
  7. Person("Vasilisa", "Saint-Petersburg", "+7-999-123456")
  8. )
  9. val phoneBook = people.associateBy { it.phone } // 3
  10. val cityBook = people.associateBy(Person::phone, Person::city) // 4
  11. val cityBook222 = people.associateBy(Person::city, Person::name) // 4
  12. val peopleCities = people.groupBy(Person::city, Person::name) // 5
  13. println("people:$people")
  14. println("phoneBook:$phoneBook")
  15. println("cityBook222:$cityBook222")
  16. println("cityBook:$cityBook")
  17. println("peopleCities:$peopleCities")
  18. }
  19. 复制代码

输出结果:

  1. people:[Person(name=John, city=Boston, phone=+1-888-123456), Person(name=Sarah, city=Munich, phone=+49-777-789123), Person(name=Svyatoslav, city=Saint-Petersburg, phone=+7-999-456789), Person(name=Vasilisa, city=Saint-Petersburg, phone=+7-999-123456)]
  2. phoneBook:{+1-888-123456=Person(name=John, city=Boston, phone=+1-888-123456), +49-777-789123=Person(name=Sarah, city=Munich, phone=+49-777-789123), +7-999-456789=Person(name=Svyatoslav, city=Saint-Petersburg, phone=+7-999-456789), +7-999-123456=Person(name=Vasilisa, city=Saint-Petersburg, phone=+7-999-123456)}
  3. cityBook222:{Boston=John, Munich=Sarah, Saint-Petersburg=Vasilisa}
  4. cityBook:{+1-888-123456=Boston, +49-777-789123=Munich, +7-999-456789=Saint-Petersburg, +7-999-123456=Saint-Petersburg}
  5. peopleCities:{Boston=[John], Munich=[Sarah], Saint-Petersburg=[Svyatoslav, Vasilisa]}
  6. 复制代码

我们可以从输出结果中看到 通过city 作为key的时候 ,两种方式对相同key的处理

zip

zip函数将两个给定的集合合并到一个新集合中。默认情况下,结果集合包含具有相同索引的成对源集合元素。但是,您可以定义结果集合元素的自己的结构。

  1. fun main() {
  2. val A = listOf("a", "b", "c","d","e") // 1
  3. val B = listOf(1, 2, 3, 4) // 1
  4. val resultPairs = A zip B // 2
  5. val resultReduce = A.zip(B) { a, b -> "$a$b" } // 3
  6. println("A to B: $resultPairs")
  7. println("\$A\$B: $resultReduce")
  8. }
  9. 复制代码

输出结果:

  1. A to B: [(a, 1), (b, 2), (c, 3), (d, 4)]
  2. $A$B: [a1, b2, c3, d4]
  3. 复制代码

flatMap

flatMap将集合的每个元素转换为可迭代对象,并构建转换结果的单个列表。转换是用户定义的。

  1. fun main() {
  2. val numbers = listOf(1, 2, 3) // 1
  3. val tripled = numbers.flatMap {
  4. listOf(it+1) } // 2
  5. println("Numbers: $numbers")
  6. println("Transformed: $tripled")
  7. }
  8. 复制代码

输出结果:

  1. Numbers: [1, 2, 3]
  2. Transformed: [2, 3, 4]
  3. 复制代码

min,max

min和max函数返回集合中最小和最大的元素。如果集合为空,则返回null。

  1. fun main() {
  2. val numbers = listOf(1, 2, 3)
  3. val empty = emptyList<Int>()
  4. println("Numbers: $numbers, min = ${numbers.min()} max = ${numbers.max()}") // 1
  5. println("Empty: $empty, min = ${empty.min()}, max = ${empty.max()}") // 2
  6. }
  7. 复制代码

输出结果 :

  1. Numbers: [1, 2, 3], min = 1 max = 3
  2. Empty: [], min = null, max = null
  3. 复制代码

sorted sortedBy

sorted :返回根据其自然排序顺序(升序)排序的集合元素列表。

sortedBy:根据指定选择器函数返回的值的自然排序顺序对元素进行排序。

  1. fun main() {
  2. val shuffled = listOf(5, 4, 2, 1, 3) // 1
  3. val natural = shuffled.sorted() // 2
  4. val inverted = shuffled.sortedBy { -it } // 3
  5. println("Shuffled: $shuffled")
  6. println("Natural order: $natural")
  7. println("Inverted natural order: $inverted")
  8. }
  9. 复制代码

输出结果:

  1. Shuffled: [5, 4, 2, 1, 3]
  2. Natural order: [1, 2, 3, 4, 5]
  3. Inverted natural order: [5, 4, 3, 2, 1]
  4. 复制代码
getOrElse

提供对集合元素的安全访问。它采用索引和函数,在索引超出范围时提供默认值。

  1. fun main() {
  2. val list = listOf(0, 10, 20)
  3. println(list.getOrElse(1) { 42 }) // 1
  4. println(list.getOrElse(10) { 42 }) // 2
  5. }
  6. 复制代码

输出结果:

  1. 10
  2. 42
  3. 复制代码

Map Element Access

应用于map时,[]运算符返回与给定键对应的值,如果map中没有此类键,则返回null。

getValue函数返回与给定键对应的现有值,如果未找到该键则抛出异常。对于使用withDefault创建的映射,getValue返回默认值而不是抛出异常。

  1. fun main(args: Array<String>) {
  2. val map = mapOf("key" to 42)
  3. val value1 = map["key"] // 1
  4. val value2 = map["key2"] // 2
  5. val value3: Int = map.getValue("key") // 1
  6. val mapWithDefault = map.withDefault { k -> k.length }
  7. val value4 = mapWithDefault.getValue("key2") // 3
  8. try {
  9. map.getValue("anotherKey") // 4
  10. }
  11. catch (e: NoSuchElementException) {
  12. println("Message: $e")
  13. }
  14. println("value1 is $value1")
  15. println("value2 is $value2")
  16. println("value3 is $value3")
  17. println("value4 is $value4")
  18. }
  19. 复制代码

输出结果:

  1. Message: java.util.NoSuchElementException: Key anotherKey is missing in the map.
  2. value1 is 42
  3. value2 is null
  4. value3 is 42
  5. value4 is 4
  6. 复制代码

转载于:https://juejin.im/post/5c9250a95188252da225045f

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/576010
推荐阅读
相关标签
  

闽ICP备14008679号