惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
Webroot Blog
Webroot Blog
T
The Blog of Author Tim Ferriss
S
Schneier on Security
罗磊的独立博客
P
Privacy & Cybersecurity Law Blog
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
P
Palo Alto Networks Blog
月光博客
月光博客
MongoDB | Blog
MongoDB | Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
量子位
NISL@THU
NISL@THU
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
Stack Overflow Blog
Stack Overflow Blog
Recorded Future
Recorded Future
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
Lohrmann on Cybersecurity
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
L
LINUX DO - 热门话题
Help Net Security
Help Net Security
B
Blog RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
I
InfoQ
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The Cloudflare Blog
H
Heimdal Security Blog
Last Week in AI
Last Week in AI
美团技术团队
云风的 BLOG
云风的 BLOG
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
V
Visual Studio Blog
G
GRAHAM CLULEY
AI
AI
Security Latest
Security Latest
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
Cyberwarzone
Cyberwarzone
Microsoft Security Blog
Microsoft Security Blog
P
Proofpoint News Feed

博客园 - y丶innocence

临时111 RecyclerView 数据多时无法滑动:ConstraintLayout 约束高度修复笔记 Android Kotlin OkHttp3 WebSocket 长连接与 Gson 数据解析系统笔记 Android + Kotlin + OkHttp WebSocket 相关概念与使用流程笔记(TLS/证书 + 鉴权/会话) AI对话导出markdown格式流程 代理转发 分享文件 面向全球的app的excel导出和kotlin IO原理 安卓导出笔记(未整理) java&kotlin listener 0.7 动画 0.4 View 工作流程 0.3 view 滑动冲突 13. Jetpack 0. 安卓开发艺术探索参考资料 12. Material Design 7. 持久化技术 5. Fragment java 基础 4. UI 开发 3. Activity 2.2 Kotlin 面向对象 2.3 Kotlin高级 1. Android简介 [OpenJudge] 反正切函数的应用 (枚举)(数学) [OpenJudge] 摘花生 (模拟)
2.1 Kotlin基础
y丶innocence · 2026-01-07 · via 博客园 - y丶innocence

2.1 Kotlin基础

1. 变量

1.1 变量的自动推导

  • java 中基本数据类型为小写,而 Kotlin 中是大写,即是对象数据类型,即是一个类
  • 其中抽象类为 Number
val a = 10
val b = "abc"
val c = 20.5
//println(a+b)          // 类型推导报错
println("$a$b")         // 10abc
println(b+a)            // abc10
println(a+c)            // 30.5
println("a = "+ a)      // a = 10
println("a = $a")       // 10
  • 显式转换方式
  • .toInt()
var numA: Int = 97
println(numA.toByte())
println(numA.toShort())
println(numA.toInt())
println(numA.toLong())
println(numA.toFloat())
println(numA.toDouble())
println(numA.toChar())
println(numA.toString())

1.2 val, var, const val

  • val:不可修改变量
    • 对于对象,是引用不可变,而不是值不可变
  • var:可修改变量
  • const val:常量
    • 只能用于
      • 顶层声明
      • object修饰的类中
      • 伴生对象中
const val f = 10
fun main(){

    val a: Int = 10     // 立即初始化
    val b = 5           // 推导出类型
    val c : Float       // 没有初始化的时候,必须声明类型,使用前赋值
    val list = mutableListOf(1, 2, 3) 
    list.add(4)
//    var d  报错
//    const val e = 10  报错
    c = 12.5F
    println("$a \n$b \n$c \n$f \n")
}

2. 函数

fun main(){
    val sum1 = add1(2,5)
    val sum2 = add2(2,5)
    val sum3 = add3(2,5)
    println(sum1)
    println(sum2)
    println(sum3)
}

fun add1(num1: Int, num2: Int): Int{
    return num1 + num2
}
fun add2(num1: Int, num2: Int): Int = num1 + num2   // 一行时可以直接使用 =
fun add3(num1: Int, num2: Int) = num1 + num2   // 进一步简化
val add4 = fun(num1: Int, num2: Int) = num1 + num2 // 匿名函数

3. 逻辑控制

3.1 if 语句

fun largerNum1(num1: Int, num2: Int): Int{
    var num : Int
    if(num1 > num2){
        num = num1
    } else {
        num = num2
    }
    return num
}
fun largerNum2(num1: Int, num2: Int): Int{  // if语句每个条件中最后一行代码就是返回值
    val num = if(num1 > num2){
         num1
    } else {
        num2
    }
    return num
}
fun largerNum3(num1: Int, num2: Int): Int{  // 省略 val
    return if(num1 > num2){
        num1
    } else {
        num2
    }
}

fun largerNum4(num1: Int, num2: Int) = if(num1 > num2) {    // 相当于一行,简写
    num1
}else{
    num2
}

fun largerNum5(num1: Int, num2: Int) = if(num1 > num2) num1 else num2 
  • if也可以视作三元运算符
val a = 10
val b = if(a > 5) 15 else 5
val c = if(a < 5) 15 else 5
println("$b \t $c")

3.2 when 语句

  • 类似 switch 语句,但更强大

1. 与逗号一起实现 switch 功能

when(2){
    1,2,3 -> {			// 可以有括号,也可以没有
        println(123)
    }
    4 -> println(4)
    5 -> println(5)
    else -> println(0)
}

2. 检查值是否存在于集合或数组中

val arrayList = arrayOf(1,2,3,4,5)
when(1){
    in arrayList.toIntArray() -> {					// in 判断是否在集合内
        println("1 存在于 arrayList数组中")
    }
    in 0 .. 10 -> println("1 属于于 0~10 中")   	 // .. 表示闭区间
    !in 5 .. 10 -> println("1 不属于 5~10 中")
    else -> {
        println("都不存在")
    }
}

3. 检查类型

// 智能转换
var a: Int = 2
when(a){
    !is Int -> {
        println("$a 不是一个Int类型的值")
    }
    else -> {
        a = a.shl(2)		// 右移
        println("a => $a")
    }
}

3.3 for 语句

1. 普通循环

for(i in 1 .. 10){              // [1, 10]
    println(i)
}

for(i in 1 until 10){           // [1, 10)
    println(i)
}

for(i in 10 downTo 1){          // [1, 10) 逆序
    println(i)
}

for(i in 10 downTo 1 step 2){
    println(i)
}

2. 迭代

// 字符串
for (i in "abcdefg"){
    println(i)
}

// 数组
val arrayList = arrayOf(10,20,30,40,50)
for (i in arrayList){
    println(i)
}

// 数组 indices
for (i in arrayList.indices){
    println("arrayList[$i] => " + arrayList[i])
}

// 数组 withIndex
for ((index,value) in arrayList.withIndex()){
    println("index => $index \t value => $value")
}

4. 空指针检查

4.1 可空类型变量

1. java/c++ 中的空指针

public void doStudy(Study study){
    if(study != null){
        study.readingBooks();
        study.doHomeworks();
    }
}

2. Kotlin 中的可空类型

  • 在 kotlin 中,普通变量默认不能为空
  • 因此提出可空类型
var nullA : Int? = 12
val nullB : Int? = 13

nullA = null

if(nullA == null){
    println("nullA = $nullA")
}

4.2 可空类型的判断 ?. 运算符

fun main(){
    val s = Study()
    val sList = listOf(s, null)
    for(s in sList){
//        doStudy(s)                // 无法处理 null
        doStudyNull(s)
        doStudyNullIfElse(s)
    }
}

fun doStudy(study: Study){
    study.readingBooks()
    study.doHomework()
}

fun doStudyNullIfElse(study: Study?){   // if-else 判断可空
    if(study!=null){
        study.readingBooks()
        study.doHomework()
    }
}

fun doStudyNull(study: Study?){         // ?. 判断可空
    study?.readingBooks()
    study?.doHomework()
}

class Study{
    fun readingBooks(){ println("reading.")}
    fun doHomework(){ println("doing.")}
}

4.3 可空类型的应用

1. 可空类型的函数和 ?: 运算符

val str1 = "123"
val str2 : String? = null

fun func1(str : String?) : Int? {     // 可空参数 和 可空返回值
    return str?.length
}

fun func2(str : String?) : Int {    
    return str?.length ?: 0			  // ?: 运算符
}

println(func1(str1))
println(func1(str2))
println(func2(str2))

2. let 操作符

  • 作用:配合符号 ?. 忽略容器中的 null
fun doStudy(study: Study?){
    study?.let{
        stu -> stu.doHomework()
    }
}

fun doStudy(study: Study?){
    study?.let{ it.doHomework() } // it 关键字简化
}

3. !! 操作符

  • 对于一个全局非空变量
  • 如果在主函数里面判定非空,并调用函数
  • 然后在调用函数里面如果不判空,则会报错,因为不知道已经判空了
  • 此时可以加上 !! 操作符,表示非空断言,即确定不会为空,不需要检查,如果出错抛出异常,后果自己承担
var str : String? = "hello"

fun main() {
    if(str != null){
        printUpperCase()
    }
}
fun printUpperCase() {
//    val upperCase = str.uppercase()   // 报错,不知道已经判空
    val upperCase = str!!.uppercase()
    println(upperCase)
}

4. as? 操作符

  • 功能:类型转换
  • 转换失败
    • as? 返回 null
    • as 抛出异常
val num1 : Int? = "Koltin" as Int  // 会抛出ClassCastException异常
println("nun1 = $num1")

val num2 : Int? = "Koltin" as? Int
println("nun2 = $num2")

5. 链式调用

【暂时没get到】

class Test{
    class Builder{
        private var name : String? = "Tom"
        private var age : Int? = 0
        private var sex : String? = "男"

        fun setName(name : String) : Builder?{
            this.name = name
            return this
        }
        fun setAge(age : Int) : Builder?{
            this.age = age
            return this
        }
        fun setSex(sex: String?) : Builder?{
            this.sex = sex
            return this
        }
        override fun toString(): String {
            return "Builder(name=$name, age=$age, sex=$sex)"
        }
    }
}

fun main(args: Array<String>) {
    val builder : Test.Builder? = Test.Builder().setName("Lily")?.setSex("nv")?.setAge(10)
    println(builder.toString())   // 输出为:Builder(name=Lily, age=10, sex=女)
}