📜  科特林 |集合转换

📅  最后修改于: 2022-05-13 01:55:47.855000             🧑  作者: Mango

科特林 |集合转换

Kotlin 标准库为集合转换提供了不同的扩展函数集。这些函数有助于根据转换定义的规则从现有集合构建新集合。
有不同数量的转换函数:

  • 映射
  • 拉链
  • 协会
  • 展平
  • 字符串表示

映射 –

映射转换用于从一个函数在另一个集合的元素上获得的结果创建一个集合,用于映射的基本函数是map() 。当将给定的 lambda函数应用于每个后续元素时,它会返回 lambda 结果列表。
它保持元素的顺序存储在原始集合中。为了应用额外使用元素索引作为参数的转换,我们可以使用mapIndexed()
Kotlin 映射程序 –

Java
fun main(args : Array) {
    val numbers = setOf(1, 2, 3)
 
    // multiple all elements by 2
    println("The new elements are: "+numbers.map { it * 2 })
 
    // multiple idx with element
    println("The modified elements are: "+numbers.mapIndexed
    { idx, value -> value * idx })
}


Kotlin
fun main(args: Array) {
    val numbers = setOf(1, 2, 3)
 
    // filter out the null values and print
    println("Numbers without null value: "+numbers.mapNotNull
    { if ( it == 1) null else it * 2 })
 
    println("Numbers without null value: "+numbers.mapIndexedNotNull
    { idx, value -> if (idx == 0) null else value * idx })
}


Kotlin
fun main(args: Array) {
    val numbers = listOf("One","Two","Three","four")
    val integers = listOf(1,2,3,4)
 
    // pair string number with integers
    println(numbers zip integers)
 
    val newInt = listOf(1,2)
    // pair string with less than numbers
    println("New pairs :"+numbers.zip(newInt))
}


Kotlin
fun main(args: Array) {
    val companies = listOf("Apple" to 1, "Google" to 2,
        "Amazon" to 3, "Facebook" to 4)
 
    // print after unzip the pairs
    println("Pairs unzipped: "+companies.unzip())
}


Kotlin
fun main(args: Array) {
 
    val captains = listOf("Kohli", "Root", "Smith", "Williamson","Root")
     
    // print the elements associated with their length
    println(captains.associateWith { it.length })
}


Kotlin
fun main(args: Array) {
 
    val openers = listOf(setOf("Warner", "Finch") ,setOf("Roy","Bairstow")
        ,setOf("Rohit,Dhawan"),setOf("Guptill","Henry"))
 
    // print the elements associated with their length
    println("All the openers are: "+openers.flatten())
}


Kotlin
fun main(args: Array) {
    val colors = listOf("Red","Green","Blue","Orange","Yellow")
 
    println(colors)
    // join all elements in a single List
    println(colors.joinToString())
 
    val listString = StringBuffer("Colors are: ")
    colors.joinTo(listString)
    println(listString)
}


输出:

The new elements are: [2, 4, 6]
The modified elements are: [0, 2, 6]

转换后,如果我们在某些元素上获得空值,我们可以通过调用mapNotNull()函数而不是map()mapIndexedNotNull()而不是mapIndexed()轻松地从集合中过滤掉空值。

科特林

fun main(args: Array) {
    val numbers = setOf(1, 2, 3)
 
    // filter out the null values and print
    println("Numbers without null value: "+numbers.mapNotNull
    { if ( it == 1) null else it * 2 })
 
    println("Numbers without null value: "+numbers.mapIndexedNotNull
    { idx, value -> if (idx == 0) null else value * idx })
}

输出:

Numbers without null value: [4, 6]
Numbers without null value: [2, 6]

拉链 –

压缩转换通过从相同索引值的两个集合中选择元素来帮助构建对,并且可以在zip()扩展函数的帮助下完成。它可以通过传递另一个集合(数组)作为参数在集合或数组上调用,它返回Pair对象列表。
接收集合中对的第一个元素和集合中的第二个元素作为参数传递。如果集合大小不匹配,则 zip() 的结果集合等效于较小大小的集合,并且较大集合的最后一个元素将从结果中排除。它也可以以a zip b的中缀形式调用。
使用 zip() 方法的 Kotlin 程序 –

科特林

fun main(args: Array) {
    val numbers = listOf("One","Two","Three","four")
    val integers = listOf(1,2,3,4)
 
    // pair string number with integers
    println(numbers zip integers)
 
    val newInt = listOf(1,2)
    // pair string with less than numbers
    println("New pairs :"+numbers.zip(newInt))
}

输出:

[(One, 1), (Two, 2), (Three, 3), (four, 4)]
New pairs :[(One, 1), (Two, 2)]

如果我们有一个配对列表,那么我们可以使用帮助解压缩扩展函数进行反向转换,该功能从这些配对构建两个列表:

  • 第一个列表包含原始列表中每对的第一个元素。
  • 第二个列表包含原始列表中的第二个元素。

使用 unzip() 方法的 Kotlin 程序 –

科特林

fun main(args: Array) {
    val companies = listOf("Apple" to 1, "Google" to 2,
        "Amazon" to 3, "Facebook" to 4)
 
    // print after unzip the pairs
    println("Pairs unzipped: "+companies.unzip())
}

输出:

Pairs unzipped: ([Apple, Google, Amazon, Facebook], [1, 2, 3, 4])

协会 -

关联转换有助于从集合元素和与之关联的某些值构建映射。这里,基本的关联函数是associateWith() ,它创建一个 Map,其中原始集合元素是键,关联值是通过给定的转换函数从原始元素获得的。
注意:如果我们得到两个相等的元素,那么只有最后一个保留在地图上。
使用 associateWith() 方法的 Kotlin 程序 –

科特林

fun main(args: Array) {
 
    val captains = listOf("Kohli", "Root", "Smith", "Williamson","Root")
     
    // print the elements associated with their length
    println(captains.associateWith { it.length })
}

输出:

{Kohli=5, Root=4, Smith=5, Williamson=10}

压扁——

展平转换有助于将所有嵌套集合转换为单个集合。如果我们操作嵌套集合,我们会发现提供对嵌套集合元素的平面访问的标准库函数很有用。
基本函数是flatten() ,我们可以在集合的集合上调用它,例如,集合列表,然后它返回嵌套集合的所有元素的单个列表。
使用 flatten() 方法的 Kotlin 程序 –

科特林

fun main(args: Array) {
 
    val openers = listOf(setOf("Warner", "Finch") ,setOf("Roy","Bairstow")
        ,setOf("Rohit,Dhawan"),setOf("Guptill","Henry"))
 
    // print the elements associated with their length
    println("All the openers are: "+openers.flatten())
}

输出:

All the openers are: [Warner, Finch, Roy, Bairstow, Rohit,Dhawan, Guptill, Henry]

字符串表示 -

字符串表示意味着我们可以以可读格式检索集合内容。有两个函数可以将集合转换为字符串:

  • 加入字符串()
  • 加入()

函数joinToString()根据提供的参数从集合元素构建单个字符串。并且函数joinTo()也构建单个字符串,但将结果附加到给定的Appendable对象。
当使用默认参数调用上述函数时,两者都返回类似于在集合上调用toString()的结果:一个由逗号和空格分隔的元素的字符串表示形式的字符串。
使用字符串表示方法的 Kotlin 程序 –

科特林

fun main(args: Array) {
    val colors = listOf("Red","Green","Blue","Orange","Yellow")
 
    println(colors)
    // join all elements in a single List
    println(colors.joinToString())
 
    val listString = StringBuffer("Colors are: ")
    colors.joinTo(listString)
    println(listString)
}

输出:

[Red, Green, Blue, Orange, Yellow]
Red, Green, Blue, Orange, Yellow
Colors are: Red, Green, Blue, Orange, Yellow