// // 第 3 课集合List / Set / Map 空安全(null) // fun main() { // 一、List有序的列表最常用 // listOf 创建一个“只读”列表不能增删改 val fruits listOf(苹果, 香蕉, 橙子) println(水果列表$fruits) println(一共有 ${fruits.size} 种) // .size 是元素个数 println(第一个是 ${fruits[0]}) // 用 [下标] 取元素下标从 0 开始 println(最后一个是 ${fruits.last()}) // 遍历列表 print(挨个打印) for (fruit in fruits) print($fruit ) println() // 想要能“增删改”的列表用 mutableListOf val numbers mutableListOf(1, 2, 3) numbers.add(4) // 添加 numbers.remove(2) // 删除元素 2 numbers[0] 100 // 修改第 0 个 println(可变列表操作后$numbers) // 二、集合的“函数式”操作超好用 val scores listOf(50, 88, 92, 71, 45) // filter筛选出满足条件的元素这里筛及格的 val passed scores.filter { it 60 } // it 代表“当前这个元素” println(及格的分数$passed) // map把每个元素“变换”成新的值这里每个分数 5 val bonus scores.map { it 5 } println(每人加5分$bonus) // 还能链式组合先筛及格再看有几个 println(及格人数${scores.filter { it 60 }.size}) // 一些常用统计 println(总分${scores.sum()}, 最高${scores.max()}, 平均${scores.average()}) // 三、Map键值对像字典名字 - 电话 val phoneBook mapOf( 小明 to 138xxxx, 小红 to 139xxxx ) println(小明的电话${phoneBook[小明]}) // 用 [键] 取值 // 遍历 Map for ((name, phone) in phoneBook) { println($name 的号码是 $phone) } // 四、空安全 nullKotlin 的招牌特性 // 在很多语言里变量没值时是 null一不小心访问就崩溃著名的“空指针异常”。 // Kotlin 从语法层面帮你防住这个问题。 // 默认情况下变量【不允许】为 null val city: String 北京 // val bad: String null // ← 这行会直接编译报错不允许 // 如果确实可能为空要在类型后面加 ? 表示“可空” // 这里从下面的 findNickname 函数拿昵称它可能返回名字也可能返回 null val nickname: String? findNickname(id 99) // 传个查不到的 id会得到 null // 对可空变量不能直接用否则编译器不让过。要用下面几种安全方式 // (1) 安全调用 ?. —— 如果是 null 就不执行直接返回 null println(昵称长度${nickname?.length}) // nickname 是 null所以打印 null // (2) Elvis 运算符 ?: —— “如果左边是 null就用右边的默认值” val len nickname?.length ?: 0 println(昵称长度(为空则算0)$len) val show nickname ?: 匿名用户 println(显示名$show) // (3) 先判断再使用判断后编译器就知道它不是 null 了 val nickname2 findNickname(id 1) // 这次能查到 if (nickname2 ! null) { // 进到这里编译器已确定 nickname2 不是 null可以放心用 .length println(昵称有值$nickname2长度 ${nickname2.length}) } else { println(昵称是空的) } // 综合示范从通讯录查一个不存在的人 val unknown phoneBook[路人甲] // 查不到返回 null println(路人甲的电话${unknown ?: 查无此人}) } // 一个返回“可空类型 String?”的函数id 为 1 时返回名字否则返回 null fun findNickname(id: Int): String? { return if (id 1) 小明 else null }全部跑通 结果都对注意看可变列表那行[1,2,3]→ 加 4、删掉元素 2、把第 0 个改成 100 → 最终[100, 3, 4]水果列表[苹果, 香蕉, 橙子]及格的分数[88, 92, 71]每人加5分[55, 93, 97, 76, 50]总分346, 最高92, 平均69.2昵称长度null显示名匿名用户路人甲的电话查无此人第 3 课知识点复盘一、List列表—— 有序的一串数据操作写法说明创建只读列表listOf(a,b)不能增删改创建可变列表mutableListOf(1,2)能add/remove/ 改取元素list[0]下标从 0 开始第一个是 0 号个数list.size遍历for (x in list) { }⚠️ 新手最容易踩的坑下标从 0 开始。3 个元素的下标是 0、1、2没有list[3]会崩溃。二、函数式操作 —— Kotlin 的精华 ✨这是让代码变优雅的关键日后写业务逻辑天天用scores.filter { it 60 } // 筛选留下满足条件的scores.map { it 5 } // 变换把每个元素改成新值{ ... }是一小段处理逻辑叫 lambda后面会专门讲it是关键字代表当前正在处理的这个元素还能链式连起来scores.filter{...}.map{...}.sum()三、Map映射—— 键值对像字典val m mapOf(小明 to 138xxxx) // 键 to 值m[小明] // 用键取值for ((k, v) in m) { } // 同时拿到键和值四、空安全 —— Kotlin 的招牌 ️这是 Kotlin 相比很多老语言最大的优势之一专门防止空指针崩溃。语法名字作用String不可空默认不允许是 nullString?可空加?才允许为 nulla?.length安全调用a 是 null 就返回 null不崩溃a ?: 默认值Elvis 运算符a 是 null 就用右边的默认值if (a ! null) {...}判空判断后编译器就允许直接用 a对照输出理解nickname是 null →nickname?.length打印null安全调用没崩nickname ?: 匿名用户→ 因为是 null用了默认值匿名用户nickname2查到了小明 → 判空后能安全访问.length得到 2 为什么这么重要在 Java、C 等语言里几乎所有 App 崩溃的头号原因就是空指针。Kotlin 用?从编译阶段就逼你处理好让 App 更稳定。这也是 Google 推荐用 Kotlin 写安卓的重要原因。小练习 ✍️给你个综合题可以让我帮你跑有一个列表val ages listOf(15, 22, 17, 30, 8)用filter筛选出所有成年人≥18并打印出成年人的数量。