Skip to content

快速上手

概述

本章将通过实际代码示例快速介绍Kotlin的核心特性。我们将从最简单的"Hello World"程序开始,逐步展示Kotlin的强大功能。

第一个Kotlin程序

Hello World

kotlin
fun main() {
    println("Hello, Kotlin!")
}

关键点:

  • fun 关键字定义函数
  • main() 是程序入口点
  • println() 输出文本并换行
  • 无需分号结尾(可选)

带参数的main函数

kotlin
fun main(args: Array<String>) {
    if (args.isNotEmpty()) {
        println("Hello, ${args[0]}!")
    } else {
        println("Hello, World!")
    }
}

变量和常量

变量声明

kotlin
fun main() {
    // 可变变量 (var)
    var name = "Kotlin"  // 类型推断
    var age: Int = 25    // 显式类型声明
    
    name = "Kotlin 1.9"  // 可以重新赋值
    age = 26
    
    // 不可变变量 (val)
    val language = "Kotlin"
    val version = 1.9
    
    // language = "Java"  // 编译错误!val不能重新赋值
    
    println("Language: $language, Version: $version")
    println("Name: $name, Age: $age")
}

空安全

kotlin
fun main() {
    // 非空类型
    var name: String = "Kotlin"
    // name = null  // 编译错误!
    
    // 可空类型
    var nullableName: String? = "Kotlin"
    nullableName = null  // 允许
    
    // 安全调用
    println("Length: ${nullableName?.length}")
    
    // Elvis操作符
    val length = nullableName?.length ?: 0
    println("Length with default: $length")
    
    // 非空断言 (谨慎使用)
    nullableName = "Kotlin"
    println("Definite length: ${nullableName!!.length}")
}

基本数据类型

kotlin
fun main() {
    // 数字类型
    val byte: Byte = 127
    val short: Short = 32767
    val int: Int = 2147483647
    val long: Long = 9223372036854775807L
    
    val float: Float = 3.14f
    val double: Double = 3.14159265359
    
    // 字符和布尔
    val char: Char = 'K'
    val boolean: Boolean = true
    
    // 字符串
    val string: String = "Kotlin"
    
    println("Numbers: $int, $long, $double")
    println("Others: $char, $boolean, $string")
}

字符串操作

kotlin
fun main() {
    val name = "Kotlin"
    val version = 1.9
    
    // 字符串模板
    println("Welcome to $name!")
    println("Version: $version")
    println("Length: ${name.length}")
    
    // 多行字符串
    val multiline = """
        |Kotlin is a modern programming language
        |that makes developers happier.
        |It's concise, safe, and interoperable.
    """.trimMargin()
    
    println(multiline)
    
    // 字符串操作
    println("Uppercase: ${name.uppercase()}")
    println("Contains 'lin': ${name.contains("lin")}")
    println("Starts with 'Kot': ${name.startsWith("Kot")}")
}

集合

列表 (List)

kotlin
fun main() {
    // 不可变列表
    val readOnlyList = listOf("Apple", "Banana", "Cherry")
    println("Fruits: $readOnlyList")
    println("First fruit: ${readOnlyList[0]}")
    println("Size: ${readOnlyList.size}")
    
    // 可变列表
    val mutableList = mutableListOf("Kotlin", "Java")
    mutableList.add("Python")
    mutableList.remove("Java")
    println("Languages: $mutableList")
    
    // 列表操作
    val numbers = listOf(1, 2, 3, 4, 5)
    val doubled = numbers.map { it * 2 }
    val evens = numbers.filter { it % 2 == 0 }
    
    println("Original: $numbers")
    println("Doubled: $doubled")
    println("Evens: $evens")
}

映射 (Map)

kotlin
fun main() {
    // 不可变映射
    val readOnlyMap = mapOf(
        "name" to "Kotlin",
        "version" to "1.9",
        "type" to "Programming Language"
    )
    
    println("Map: $readOnlyMap")
    println("Name: ${readOnlyMap["name"]}")
    
    // 可变映射
    val mutableMap = mutableMapOf<String, Int>()
    mutableMap["apple"] = 5
    mutableMap["banana"] = 3
    mutableMap["cherry"] = 8
    
    println("Fruit counts: $mutableMap")
    
    // 遍历映射
    for ((fruit, count) in mutableMap) {
        println("$fruit: $count")
    }
}

函数

基本函数

kotlin
// 简单函数
fun greet(name: String): String {
    return "Hello, $name!"
}

// 单表达式函数
fun add(a: Int, b: Int) = a + b

// 带默认参数的函数
fun greetWithDefault(name: String = "World", greeting: String = "Hello") {
    println("$greeting, $name!")
}

fun main() {
    println(greet("Kotlin"))
    println("Sum: ${add(5, 3)}")
    
    greetWithDefault()
    greetWithDefault("Kotlin")
    greetWithDefault("Kotlin", "Hi")
    greetWithDefault(greeting = "Hey", name = "Developer")
}

高阶函数

kotlin
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    
    // 使用lambda表达式
    val doubled = numbers.map { number -> number * 2 }
    val tripled = numbers.map { it * 3 }  // it是单参数lambda的默认名称
    
    println("Doubled: $doubled")
    println("Tripled: $tripled")
    
    // 自定义高阶函数
    fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
        return operation(x, y)
    }
    
    val sum = calculate(5, 3) { a, b -> a + b }
    val product = calculate(5, 3) { a, b -> a * b }
    
    println("Sum: $sum")
    println("Product: $product")
}

类和对象

基本类

kotlin
// 简单类
class Person(val name: String, var age: Int) {
    fun introduce() {
        println("Hi, I'm $name and I'm $age years old.")
    }
    
    fun haveBirthday() {
        age++
        println("Happy birthday! Now I'm $age.")
    }
}

fun main() {
    val person = Person("Alice", 25)
    person.introduce()
    person.haveBirthday()
}

数据类

kotlin
// 数据类自动生成equals, hashCode, toString等方法
data class User(val id: Int, val name: String, val email: String)

fun main() {
    val user1 = User(1, "John", "john@example.com")
    val user2 = User(1, "John", "john@example.com")
    val user3 = user1.copy(name = "Jane")  // 复制并修改
    
    println("User1: $user1")
    println("User1 == User2: ${user1 == user2}")  // true
    println("User3: $user3")
    
    // 解构声明
    val (id, name, email) = user1
    println("ID: $id, Name: $name, Email: $email")
}

条件语句

if表达式

kotlin
fun main() {
    val score = 85
    
    // if作为表达式
    val grade = if (score >= 90) {
        "A"
    } else if (score >= 80) {
        "B"
    } else if (score >= 70) {
        "C"
    } else {
        "F"
    }
    
    println("Score: $score, Grade: $grade")
    
    // 简化形式
    val status = if (score >= 60) "Pass" else "Fail"
    println("Status: $status")
}

when表达式

kotlin
fun main() {
    val day = 3
    
    val dayName = when (day) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6, 7 -> "Weekend"
        else -> "Invalid day"
    }
    
    println("Day $day is $dayName")
    
    // when与范围
    val number = 15
    when (number) {
        in 1..10 -> println("Small number")
        in 11..20 -> println("Medium number")
        else -> println("Large number")
    }
    
    // when与类型检查
    fun describe(obj: Any): String = when (obj) {
        is String -> "String of length ${obj.length}"
        is Int -> "Integer: $obj"
        is List<*> -> "List with ${obj.size} elements"
        else -> "Unknown type"
    }
    
    println(describe("Hello"))
    println(describe(42))
    println(describe(listOf(1, 2, 3)))
}

循环

kotlin
fun main() {
    // for循环
    println("Numbers 1 to 5:")
    for (i in 1..5) {
        print("$i ")
    }
    println()
    
    // 遍历集合
    val fruits = listOf("Apple", "Banana", "Cherry")
    println("Fruits:")
    for (fruit in fruits) {
        println("- $fruit")
    }
    
    // 带索引遍历
    println("Fruits with index:")
    for ((index, fruit) in fruits.withIndex()) {
        println("$index: $fruit")
    }
    
    // while循环
    var count = 0
    while (count < 3) {
        println("Count: $count")
        count++
    }
    
    // repeat函数
    repeat(3) { index ->
        println("Repeat $index")
    }
}

扩展函数

kotlin
// 为String类添加扩展函数
fun String.isPalindrome(): Boolean {
    val cleaned = this.lowercase().replace(" ", "")
    return cleaned == cleaned.reversed()
}

// 为Int类添加扩展函数
fun Int.isEven(): Boolean = this % 2 == 0

fun main() {
    val text = "A man a plan a canal Panama"
    println("'$text' is palindrome: ${text.isPalindrome()}")
    
    val number = 42
    println("$number is even: ${number.isEven()}")
    
    // 使用标准库扩展函数
    val numbers = listOf(1, 2, 3, 4, 5)
    println("Sum: ${numbers.sum()}")
    println("Average: ${numbers.average()}")
    println("Max: ${numbers.maxOrNull()}")
}

实际应用示例

简单的待办事项管理器

kotlin
data class Task(val id: Int, val title: String, var completed: Boolean = false)

class TodoManager {
    private val tasks = mutableListOf<Task>()
    private var nextId = 1
    
    fun addTask(title: String) {
        tasks.add(Task(nextId++, title))
        println("Added task: $title")
    }
    
    fun completeTask(id: Int) {
        tasks.find { it.id == id }?.let { task ->
            task.completed = true
            println("Completed task: ${task.title}")
        } ?: println("Task not found")
    }
    
    fun listTasks() {
        if (tasks.isEmpty()) {
            println("No tasks found")
            return
        }
        
        println("Tasks:")
        tasks.forEach { task ->
            val status = if (task.completed) "✓" else "○"
            println("$status ${task.id}. ${task.title}")
        }
    }
    
    fun getCompletedCount() = tasks.count { it.completed }
    fun getTotalCount() = tasks.size
}

fun main() {
    val todoManager = TodoManager()
    
    // 添加任务
    todoManager.addTask("Learn Kotlin basics")
    todoManager.addTask("Build a simple app")
    todoManager.addTask("Read Kotlin documentation")
    
    // 显示任务
    todoManager.listTasks()
    
    // 完成任务
    todoManager.completeTask(1)
    todoManager.completeTask(3)
    
    // 显示更新后的任务
    println("\nUpdated tasks:")
    todoManager.listTasks()
    
    // 显示统计
    println("\nProgress: ${todoManager.getCompletedCount()}/${todoManager.getTotalCount()} completed")
}

常见错误和解决方案

1. 空指针异常

kotlin
// 错误方式
fun badExample() {
    var name: String? = null
    // println(name.length)  // 编译错误
}

// 正确方式
fun goodExample() {
    var name: String? = null
    
    // 安全调用
    println("Length: ${name?.length}")
    
    // 使用let
    name?.let { 
        println("Name is not null: $it")
    }
    
    // Elvis操作符
    val length = name?.length ?: 0
    println("Length: $length")
}

2. 类型推断问题

kotlin
fun main() {
    // 模糊的类型推断
    // val list = emptyList()  // 编译错误:无法推断类型
    
    // 明确指定类型
    val list: List<String> = emptyList()
    // 或者
    val list2 = emptyList<String>()
    
    println("Lists created successfully")
}

最佳实践

  1. 优先使用val而不是var
  2. 利用类型推断,但在必要时明确指定类型
  3. 使用数据类来表示简单的数据容器
  4. 充分利用扩展函数来增强现有类的功能
  5. 使用when表达式替代复杂的if-else链

下一步

现在您已经快速了解了Kotlin的核心特性,让我们深入学习Kotlin的基本语法规则。

下一章: 基本语法

练习题

  1. 创建一个简单的计算器程序,支持加减乘除运算
  2. 实现一个学生成绩管理系统,包含学生信息和成绩计算
  3. 编写一个函数来检查字符串是否为回文
  4. 创建一个购物车类,支持添加商品、删除商品和计算总价
  5. 使用扩展函数为List添加一个查找最大值索引的方法

本站内容仅供学习和研究使用。