引言
Kotlin 是新时代的编程语言,被誉为 Java 的继任者,兼具优雅与高效。如果你还在纠结为什么要学 Kotlin,听我一句劝:人生苦短,何必被复杂语法为难?Kotlin 不仅让代码看起来更简洁,还能提升开发效率,特别适合快节奏的现代程序员。今天,我们就从 Kotlin 的基本语法开始,用幽默的方式揭开它的神秘面纱,带你畅游代码世界,让你轻松“笑”傲编程界!
基本语法快速入门
Kotlin 是一种现代化的编程语言,语法简洁且功能强大,适合构建各种类型的应用程序。本文将从基础入手,介绍 Kotlin 的基本语法要素,帮助初学者快速上手。
包的定义与导入
Kotlin 中,包声明位于源文件的顶部,格式如下:
package my.demo
import kotlin.text.*
// 其他代码
注意,目录结构与包结构无需完全匹配,源代码文件可以放置在任意位置。
程序入口点
Kotlin 应用程序的入口点是 main
函数:
fun main() {
println("Hello world!")
}
main
函数的另一种形式可以接受参数:
fun main(args: Array<String>) {
println(args.contentToString())
}
输出
print
:输出内容到标准输出,不换行。println
:输出内容并换行。
示例:
fun main() {
print("Hello ")
println("world!")
println(42)
}
函数
定义函数的基本格式:
fun sum(a: Int, b: Int): Int {
return a + b
}
或者直接用表达式形式:
fun sum(a: Int, b: Int) = a + b
示例:
fun main() {
println("sum of 19 and 23 is ${sum(19, 23)}")
}
返回无意义值的函数可以使用 Unit
,也可以省略:
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
变量
定义变量
- 不可变变量:
val
修饰,初始化后不可更改。 - 可变变量:
var
修饰,允许重新赋值。
示例:
fun main() {
val x = 5 // 不可变
var y = 10 // 可变
y += 1
println("x = $x, y = $y")
}
Kotlin 支持类型推断,必要时也可以显式指定类型。
类与对象
使用 class
关键字定义类:
class Rectangle(val height: Double, val length: Double) {
val perimeter = (height + length) * 2
}
fun main() {
val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")
}
继承需使用 open
修饰父类:
open class Shape
class Rectangle(height: Double, length: Double) : Shape()
字符串模板
Kotlin 提供字符串模板,通过 $
引用变量,或通过 ${}
引用表达式。
fun main() {
val name = "Kotlin"
println("Hello, $name!")
println("1 + 1 = ${1 + 1}")
}
条件与循环
条件表达式
if
既可以作为语句,也可以作为表达式返回值:
fun maxOf(a: Int, b: Int) = if (a > b) a else b
循环
for
循环:
val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
println(item)
}
while
循环:
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
集合操作
Kotlin 对集合操作提供了简洁的语法:
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.uppercase() }
.forEach { println(it) }
空值与空安全
Kotlin 的类型系统通过可空类型 (?
) 明确区分是否允许 null
:
fun parseInt(str: String): Int? {
return str.toIntOrNull()
}
fun main() {
val result = parseInt("123") ?: 0
println(result)
}
类型检测与转换
使用 is
操作符进行类型检测,并在检测后自动转换:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
return obj.length
}
return null
}
本文简要介绍了 Kotlin 的核心语法,适合初学者快速了解其基本特性。如果想深入学习 Kotlin,可参阅 JetBrains 官方文档。
习惯用法
1. 创建 DTO(POJO/POCO)
data class Customer(val name: String, val email: String)
data class
会为类提供以下功能:
- 属性的
getter
和(如果是var
)setter
equals()
和hashCode()
toString()
copy()
component1()
、component2()
等解构函数
2. 函数默认参数
fun foo(a: Int = 0, b: String = "") {
// ...
}
3. 过滤列表
val positives = list.filter { it > 0 }
4. 检测元素是否存在集合中
if ("john@example.com" in emailsList) {
// ...
}
5. 字符串内插
println("Name: $name")
6. 类型判断
when (x) {
is Foo -> // ...
is Bar -> // ...
else -> // ...
}
7. 只读集合
val list = listOf("a", "b", "c")
val map = mapOf("a" to 1, "b" to 2)
8. 遍历 Map
for ((key, value) in map) {
println("$key -> $value")
}
9. 区间迭代
for (i in 1..10) { /* 包含 10 */ }
for (i in 1 until 10) { /* 不包含 10 */ }
for (i in 10 downTo 1 step 2) { /* 倒序,每次减 2 */ }
10. 延迟属性
val p: String by lazy {
// 第一次访问时才会计算
"lazy value"
}
11. 扩展函数
fun String.spaceToCamelCase(): String {
// ...
}
调用:
"convert this".spaceToCamelCase()
12. 创建单例
object Resource {
val name = "Name"
}
13. 使用 inline value class
提供类型安全
@JvmInline
value class EmployeeId(private val id: String)
14. 实例化抽象类
abstract class MyAbstractClass {
abstract fun doSomething()
}
val obj = object : MyAbstractClass() {
override fun doSomething() {
// ...
}
}
15. 安全调用操作符
val size = files?.size ?: "empty"
16. 返回 when
表达式
fun transform(color: String): Int = when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color")
}
17. 使用 with
val turtle = Turtle()
with(turtle) {
penDown()
forward(100.0)
penUp()
}
18. 配置对象属性
val rectangle = Rectangle().apply {
length = 4
breadth = 5
color = 0xFAFAFA
}
19. 使用泛型和内联函数
inline fun <reified T : Any> Gson.fromJson(json: JsonElement): T {
return this.fromJson(json, T::class.java)
}
20. 交换两个变量
var a = 1
var b = 2
a = b.also { b = a }
21. 标记代码未完成
fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")
项目实战:Kotlin 基础语法案例
案例一:简单的 BMI 计算器
fun calculateBMI(weight: Double, height: Double): String {
val bmi = weight / (height * height)
return when {
bmi < 18.5 -> "Underweight"
bmi < 24.9 -> "Normal weight"
else -> "Overweight"
}
}
fun main() {
val weight = 70.0 // 体重(千克)
val height = 1.75 // 身高(米)
println("Your BMI category is: ${calculateBMI(weight, height)}")
}
案例二:学生分数等级判断
fun getGrade(score: Int): String {
return when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
in 60..69 -> "D"
else -> "F"
}
}
fun main() {
println("Your grade is: ${getGrade(85)}")
}
案例三:Todo List 应用
class TodoList {
private val tasks = mutableListOf<String>()
fun addTask(task: String) {
tasks.add(task)
println("Added: $task")
}
fun showTasks() {
println("Your tasks:")
tasks.forEachIndexed { index, task -> println("${index + 1}. $task") }
}
}
fun main() {
val todoList = TodoList()
todoList.addTask("Learn Kotlin basics")
todoList.addTask("Complete project")
todoList.showTasks()
}
避坑指南
常见坑
- NullPointerException:Kotlin 虽然有 null 安全,但操作不当仍可能引发异常。
- 未初始化变量:声明变量时别忘了赋值。
- 类型转换问题:谨慎使用
toInt()
等转换方法,避免崩溃。
解决方案
- 使用
?.
和?:
运算符处理 null。 - 初始化变量前多检查。
- 用
try-catch
捕获潜在异常。
欢迎关注 GongZhongHao,码农的乌托邦,程序员的精神家园! 🌟