Kotlin学习——kt里的集合List,Set,Map & List集合的各种方法之Int篇

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。

https://play.kotlinlang.org/byExample/01_introduction/02_Functions

其他关于kt的博客文章如下:

目录

引出


1.kt里的集合List,Set,Map,可变集合和不可变集合;

2.list集合支持的各种方法,类似于Java里面的流stream;

kotlin里的集合

List

列表是项目的有序集合。在Kotlin中,列表可以是可变的(MutableList),也可以是只读的(List)。对于列表创建,对于只读列表使用标准库函数listOf(),对于可变列表使用mutableListOf()。为了防止不必要的修改,可以通过将可变列表强制转换为List来获得可变列表的只读视图。

java 复制代码
package com.tianju.collKt

// 创建一个可变列表
val systemUsers: MutableList<Int> = mutableListOf(1, 2, 3)
// 不可变列表,不能改变元素,相当于只读列表
val sudoers: List<Int> = systemUsers

/**
 * 可变列表可以增加元素
 */
fun addSystemUser(newUser: Int) {
    systemUsers.add(newUser)
}

/**
 * 返回只读列表
 */
fun getSysSudoers(): List<Int> {
    return sudoers
}

fun main() {
    addSystemUser(4)
    println("Tot sudoers: ${getSysSudoers().size}")
    getSysSudoers().forEach {
            i -> println("Some useful info on user $i")
    }
}

Set

set是不支持重复项的无序集合

java 复制代码
package com.tianju.collKt

val openIssues: MutableSet<String> = mutableSetOf("uniqueDescr1", "uniqueDescr2", "uniqueDescr3")

/**
 * 给set 里面添加元素
 */
fun addIssue(uniqueDesc: String): Boolean {
    return openIssues.add(uniqueDesc)
}

/**
 * 返回日志
 */
fun getStatusLog(isAdded: Boolean): String {
    return if (isAdded) "registered correctly." else "marked as duplicate and rejected."
}

fun main() {
    val aNewIssue: String = "uniqueDescr4"
    val anIssueAlreadyIn: String = "uniqueDescr2"

    println("Issue $aNewIssue ${getStatusLog(addIssue(aNewIssue))}")
    println("Issue $anIssueAlreadyIn ${getStatusLog(addIssue(anIssueAlreadyIn))}")
}

Map

映射是键/值对的集合,其中每个键都是唯一的,用于检索相应的值。对于创建映射,有函数mapOf()和mutableMapOf()。使用to infix函数可以减少初始化的噪声。可变映射的只读视图可以通过将其强制转换为map来获得。

java 复制代码
package com.tianju.collKt

const val POINTS_X_PASS: Int = 15
val EZPassAccounts: MutableMap<Int, Int> = mutableMapOf(1 to 100, 2 to 100, 3 to 100)
// 创建一个只读map
val EZPassReport: Map<Int, Int> = EZPassAccounts

fun updatePointsCredit(accountId: Int) {
    // 检查key是否存在
    if (EZPassAccounts.containsKey(accountId)) {
        println("Updating $accountId...")
        EZPassAccounts[accountId] = EZPassAccounts.getValue(accountId) + POINTS_X_PASS
    } else {
        println("Error: Trying to update a non-existing account (id: $accountId)")
    }
}

// 打印key:value
fun accountsReport() {
    println("EZ-Pass report:")
    EZPassReport.forEach {
            k, v -> println("ID $k: credit $v")
    }
}

fun main() {
    accountsReport()
    updatePointsCredit(1)
    updatePointsCredit(1)
    updatePointsCredit(5)
    accountsReport()
}

List集合的各种方法

filter过滤

java 复制代码
val nums = listOf(1,3,5,6,3,-4,-3)

// 过滤
val postNums = nums.filter { x -> x>0 }
val negNums = nums.filter { it < 0 }

map 所有元素

java 复制代码
// map函数,作用于所有元素
val doubled = nums.map { x->x*2 }
val tripled = nums.map { it*3 }

any,all,none

返回值为Boolean

java 复制代码
// any, all, none
// 返回值为Boolean 布尔
val anyPost = nums.any { it>0 }
val allEven = nums.all { it%2 ==0 }
val allLess6 = nums.none { it>7 }

first,last首尾

java 复制代码
// 第一个元素,最后一个元素
val firstNum = nums.first()
val lastNum = nums.last()
// 可以传一个表达式
val firstEven = nums.first { it%2==0 }

count统计

java 复制代码
// count
val totalNums = nums.count()
val evenCount = nums.count {it%2==0}

partition隔断

按照条件分割成两个阵营

java 复制代码
// partition 隔断
// ([6, -4], [1, 3, 5, 3, -3])
val evenOdd = nums.partition { it%2 ==0 }
java 复制代码
println(evenOdd.first)

minOrNul,maxOrNull 最小和最大

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

java 复制代码
// minOrNull和maxOrNull函数返回集合中最小和最大的元素。如果集合为空,则返回null。
val numbers = listOf(1, 2, 3)
val empty = emptyList<Int>()
val only = listOf(3)

sort排序

java 复制代码
// 排序sorted
val shuffled = listOf(5, 4, 2, 1, 3, -10)
val natural = shuffled.sorted()
// 取负数后排序
val inverted = shuffled.sortedBy { -it }
// 顺序
val descending = shuffled.sortedDescending()
val descendingBy = shuffled.sortedByDescending { kotlin.math.abs(it) }

getOrElse 安全访问

getOrElse提供对集合元素的安全访问。它采用一个索引和一个函数,该函数在索引越界时提供默认值。

java 复制代码
// getOrElse
val get1 = nums.getOrElse(1){56}
val get100 = nums.getOrElse(100){200}

所有代码

java 复制代码
package com.tianju.collKt


val nums = listOf(1,3,5,6,3,-4,-3)

// 过滤
val postNums = nums.filter { x -> x>0 }
val negNums = nums.filter { it < 0 }

// map函数,作用于所有元素
val doubled = nums.map { x->x*2 }
val tripled = nums.map { it*3 }

// any, all, none
// 返回值为Boolean 布尔
val anyPost = nums.any { it>0 }
val allEven = nums.all { it%2 ==0 }
val allLess6 = nums.none { it>7 }

// 第一个元素,最后一个元素
val firstNum = nums.first()
val lastNum = nums.last()
// 可以传一个表达式
val firstEven = nums.first { it%2==0 }

// count
val totalNums = nums.count()
val evenCount = nums.count {it%2==0}

// partition 隔断
// ([6, -4], [1, 3, 5, 3, -3])
val evenOdd = nums.partition { it%2 ==0 }

// minOrNull和maxOrNull函数返回集合中最小和最大的元素。如果集合为空,则返回null。
val numbers = listOf(1, 2, 3)
val empty = emptyList<Int>()
val only = listOf(3)

// 排序sorted
val shuffled = listOf(5, 4, 2, 1, 3, -10)
val natural = shuffled.sorted()
// 取负数后排序
val inverted = shuffled.sortedBy { -it }
// 顺序
val descending = shuffled.sortedDescending()
val descendingBy = shuffled.sortedByDescending { kotlin.math.abs(it) }

// getOrElse
val get1 = nums.getOrElse(1){56}
val get100 = nums.getOrElse(100){200}

fun main() {
    println("positives is $postNums")
    println(tripled)

    println(anyPost)
    println(allEven)
    println(allLess6)

    println(firstEven)

    println()
    println(evenOdd)
    println(evenOdd.first)

    println("Numbers: $numbers, min = ${numbers.minOrNull()} max = ${numbers.maxOrNull()}")
    println("Empty: $empty, min = ${empty.minOrNull()}, max = ${empty.maxOrNull()}")
    println("Only: $only, min = ${only.minOrNull()}, max = ${only.maxOrNull()}")

    println(get100)
}

总结

1.kt里的集合List,Set,Map,可变集合和不可变集合;

2.list集合支持的各种方法,类似于Java里面的流stream;

相关推荐
Kapaseker14 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker2 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker2 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z4 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton5 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream5 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam5 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker6 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习