Kotlin开发(二):基本语法秘籍,写代码也能很诗意

引言

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 和(如果是 varsetter
  • 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()
}

避坑指南

常见坑

  1. NullPointerException:Kotlin 虽然有 null 安全,但操作不当仍可能引发异常。
  2. 未初始化变量:声明变量时别忘了赋值。
  3. 类型转换问题:谨慎使用 toInt() 等转换方法,避免崩溃。

解决方案

  • 使用 ?.?: 运算符处理 null。
  • 初始化变量前多检查。
  • try-catch 捕获潜在异常。

欢迎关注 GongZhongHao,码农的乌托邦,程序员的精神家园! 🌟

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值