快速上手
概述
本章将通过实际代码示例快速介绍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")
}最佳实践
- 优先使用val而不是var
- 利用类型推断,但在必要时明确指定类型
- 使用数据类来表示简单的数据容器
- 充分利用扩展函数来增强现有类的功能
- 使用when表达式替代复杂的if-else链
下一步
现在您已经快速了解了Kotlin的核心特性,让我们深入学习Kotlin的基本语法规则。
下一章: 基本语法
练习题
- 创建一个简单的计算器程序,支持加减乘除运算
- 实现一个学生成绩管理系统,包含学生信息和成绩计算
- 编写一个函数来检查字符串是否为回文
- 创建一个购物车类,支持添加商品、删除商品和计算总价
- 使用扩展函数为List添加一个查找最大值索引的方法