kotlin-2

太棒了!我们继续深入,探索 Kotlin 更核心、更强大的特性。这一部分将让你真正体会到 Kotlin 相比 Java 的优雅和高效。


Kotlin 基础进阶:解锁现代编程的威力

八、数据类型:不只是"一切皆对象"

Kotlin 对数据类型做了精心设计,区分了可空与否,并且所有类型都是对象,没有 Java 中的基本类型和包装类型之分。

  1. 基本类型

    • 数值类型Byte, Short, Int, Long, Float, Double
    • 其他类型Char(字符), Boolean(布尔值), String(字符串)
    kotlin 复制代码
    val number: Int = 100 // 整数
    val pi: Double = 3.14 // 双精度浮点数
    val isKotlinFun: Boolean = true // 布尔值
    val letter: Char = 'A' // 字符
    val text: String = "Hello" // 字符串
  2. 智能类型转换

    Kotlin 编译器非常智能,一旦进行了类型检查,在后续作用域内会自动进行类型转换。

    kotlin 复制代码
    fun printLength(obj: Any) { // Any 是 Kotlin 中所有类的基类,类似 Java 的 Object
        if (obj is String) { // 类型检查
            // 在这个分支内,obj 被自动转换为 String 类型
            println(obj.length) // 可以直接调用 String 的方法
        }
    
        // 或者使用 `!is` 进行否定判断
        if (obj !is String) return
        println(obj.length) // 这里 obj 也是 String 类型
    }

    对比 Java: 在 Java 中需要显式强制转换:if (obj instanceof String) { String str = (String) obj; }

九、集合:功能强大的数据容器

Kotlin 的集合分为可变和不可变两种,这是非常重要的设计理念。

  1. List(列表)

    arduino 复制代码
    // 不可变列表 - 只能读取,不能修改
    val readOnlyList: List<String> = listOf("Apple", "Banana", "Orange")
    println(readOnlyList[0]) // 输出:Apple
    // readOnlyList.add("Grape") // 错误!不可变列表不能添加元素
    
    // 可变列表 - 可以修改
    val mutableList: MutableList<String> = mutableListOf("Apple", "Banana")
    mutableList.add("Grape") // 正确!
    mutableList[0] = "Apricot" // 修改元素
  2. Set(集合)和 Map(映射)

    arduino 复制代码
    // Set - 不重复元素的集合
    val set = setOf(1, 2, 3, 2, 1) // 结果: [1, 2, 3]
    
    // Map - 键值对
    val map = mapOf("name" to "Kotlin", "version" to "1.9")
    println(map["name"]) // 输出:Kotlin

十、循环:更优雅的遍历方式

  1. for 循环

    scss 复制代码
    val fruits = listOf("Apple", "Banana", "Orange")
    
    // 遍历集合元素
    for (fruit in fruits) {
        println(fruit)
    }
    
    // 遍历索引和值
    for ((index, fruit) in fruits.withIndex()) {
        println("$index: $fruit")
    }
    
    // 遍历数字范围
    for (i in 1..5) { // 包含 1 和 5
        println(i)
    }
    
    for (i in 1 until 5) { // 不包含 5
        println(i)
    }
    
    for (i in 5 downTo 1 step 2) { // 从5到1,步长为2
        println(i) // 输出:5, 3, 1
    }
  2. while 和 do-while(与 Java 相同)

    scss 复制代码
    var x = 10
    while (x > 0) {
        println(x)
        x--
    }

十一、函数进阶:默认参数、命名参数、扩展函数

  1. 默认参数:为函数参数提供默认值

    kotlin 复制代码
    fun greet(name: String, greeting: String = "Hello") {
        println("$greeting, $name!")
    }
    
    greet("Alice") // 输出:Hello, Alice!
    greet("Bob", "Hi") // 输出:Hi, Bob!
  2. 命名参数:调用时指定参数名,提高可读性

    kotlin 复制代码
    fun createUser(name: String, age: Int, isAdmin: Boolean = false) {
        println("Name: $name, Age: $age, Admin: $isAdmin")
    }
    
    // 可以跳过有默认值的参数,随意调整顺序
    createUser(age = 25, name = "Charlie", isAdmin = true)
  3. 扩展函数:Kotlin 的"杀手级特性",可以为现有类添加新功能

    kotlin 复制代码
    // 为 String 类添加一个扩展函数
    fun String.addExcitement(): String {
        return this + "!!!"
    }
    
    println("Kotlin is fun".addExcitement()) // 输出:Kotlin is fun!!!
    
    // 为 List 添加一个扩展函数
    fun <T> List<T>.secondOrNull(): T? {
        return if (this.size >= 2) this[1] else null
    }
    
    val list = listOf("first", "second", "third")
    println(list.secondOrNull()) // 输出:second

十二、Lambda 表达式和高阶函数

这是函数式编程的核心,让代码极其简洁。

  1. Lambda 表达式基础

    kotlin 复制代码
    // 一个简单的 Lambda:接收两个 Int 参数,返回它们的和
    val sum: (Int, Int) -> Int = { a, b -> a + b }
    println(sum(3, 4)) // 输出:7
    
    // 更常见的写法:直接传递给函数
    val numbers = listOf(1, 2, 3, 4, 5)
    
    // 过滤出偶数
    val evens = numbers.filter { it % 2 == 0 } // [2, 4]
    
    // 将每个元素乘以2
    val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10]
    
    // 排序
    val sorted = numbers.sortedByDescending { it } // [5, 4, 3, 2, 1]
  2. 高阶函数:接收函数作为参数或返回函数的函数

    kotlin 复制代码
    // 接收一个函数作为参数
    fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
        return operation(a, b)
    }
    
    // 使用 Lambda 调用
    val result1 = calculate(10, 5) { x, y -> x + y } // 15
    val result2 = calculate(10, 5) { x, y -> x * y } // 50
    
    // 返回一个函数
    fun createMultiplier(factor: Int): (Int) -> Int {
        return { number -> number * factor }
    }
    
    val double = createMultiplier(2)
    val triple = createMultiplier(3)
    
    println(double(5)) // 输出:10
    println(triple(5)) // 输出:15

十三、异常处理:try-catch 也是表达式

Kotlin 的 try-catch也可以返回值,这让错误处理更加函数式。

kotlin 复制代码
fun parseNumber(str: String): Int? {
    return try {
        str.toInt() // 如果转换成功,返回数字
    } catch (e: NumberFormatException) {
        null // 如果转换失败,返回 null
    }
}

println(parseNumber("123")) // 输出:123
println(parseNumber("abc")) // 输出:null

实战演练:综合运用

让我们用学到的知识解决一个实际问题:处理学生成绩列表。

kotlin 复制代码
data class Student(val name: String, val score: Int)

fun main() {
    val students = listOf(
        Student("Alice", 85),
        Student("Bob", 92),
        Student("Charlie", 78),
        Student("Diana", 95),
        Student("Eve", 88)
    )
    
    // 找出成绩90分以上的学生名字
    val topStudents = students
        .filter { it.score > 90 }
        .map { it.name }
    println("Top students: $topStudents") // [Bob, Diana]
    
    // 计算平均分
    val averageScore = students.map { it.score }.average()
    println("Average score: $averageScore")
    
    // 按成绩降序排列
    val sortedByScore = students.sortedByDescending { it.score }
    sortedByScore.forEach { println("${it.name}: ${it.score}") }
    
    // 使用扩展函数添加实用功能
    fun List<Student>.getNames(): List<String> = this.map { it.name }
    
    val allNames = students.getNames()
    println("All names: $allNames")
}

下一步学习路径

现在你已经掌握了 Kotlin 的核心语法!接下来可以探索:

  • 面向对象编程:类、对象、继承、接口、数据类、密封类
  • 协程:Kotlin 的轻量级线程,用于异步编程
  • DSL(领域特定语言) :用 Kotlin 创建优雅的领域特定语言
  • 与 Java 互操作:在现有 Java 项目中引入 Kotlin

Kotlin 的学习曲线非常平滑,这些基础概念将为你后续的学习打下坚实的基础。尝试用 Kotlin 重写你之前用 Java 写过的小程序,你会立即感受到它的魅力!

相关推荐
whysqwhw2 小时前
kotlin-1
github
CoderJia程序员甲4 小时前
GitHub 热榜项目 - 日榜(2025-11-09)
github
labview_自动化4 小时前
GitHub笔记
笔记·github
知行力4 小时前
【GitHub每日速递 20251111】PyTorch:GPU加速、动态网络,深度学习平台的不二之选!
pytorch·深度学习·github
逛逛GitHub8 小时前
GitHub 开源 AI 好玩神器,自动记录你的一天。
前端·github
散峰而望8 小时前
C++入门(算法) - 习题
开发语言·c++·算法·github
mortimer8 小时前
faster-whisper本地转录简单方案
开源·github·openai
OpenTiny社区12 小时前
不止按钮和表格!TinyVue 偷偷上线 Space 组件,直接搞定「弹性+间距」布局
前端·vue.js·github
用户2217659279212 小时前
python第三方库可以处理多线程请求接口结果顺序问题?
github