3. Kotlin语言基础(上):Kotlin简介与优势、变量与常量、基本数据类型、条件控制(if、when)、循环控制(for、while)

各位同学,欢迎来到Kotlin的世界。说实话,我刚开始接触Android开发时,用的还是Java。那时候写一个简单的Activity,光getter/setter就能写到手软。后来Google宣布Kotlin成为官方语言,我一开始还挺抗拒的——毕竟Java用了那么多年,凭什么要换?

但当我真正花了一周时间把Kotlin用起来之后,嗯,真香。代码量直接砍半,空指针异常也少了很多。今天我们就从最基础的部分开始,把Kotlin的底子打扎实。

3.1 Kotlin简介与优势

Kotlin是JetBrains公司开发的一门静态类型编程语言,2017年被Google正式列为Android开发官方语言。它完全兼容Java,但比Java更简洁、更安全。

我个人觉得,Kotlin最大的优势就三个字:少写代码。你想想看,同样的功能,Java可能要写50行,Kotlin可能20行就搞定了。而且Kotlin天然支持空安全,很多运行时崩溃在编译阶段就被扼杀了。

Kotlin核心优势速览:

  • 简洁:减少样板代码,比如不用写findViewById
  • 安全:空指针异常(NullPointerException)几乎绝迹
  • 互操作:可以和Java代码无缝混用
  • 现代:支持函数式编程、协程等新特性

我在项目中遇到过好几次这样的情况:老项目用Java写的,新功能用Kotlin开发,两者在同一个工程里跑得稳稳的。这种平滑过渡的能力,说实话,是很多新语言做不到的。

3.2 变量与常量

Kotlin里声明变量有两种方式:varval。简单来说,var是可变的,val是不可变的(只读)。

// 可变变量
var name: String = "张三"
name = "李四"  // 没问题

// 不可变变量(常量)
val age: Int = 25
age = 30  // 编译报错!

我建议你养成一个习惯:能用val的地方,尽量别用var。为什么?因为不可变变量更安全,不容易被意外修改。我在早期写Kotlin时,图省事全用var,结果调试一个bug查了半天,最后发现是某个变量在别处被改了。从那以后,我默认都用val,只有确定需要修改时才用var

类型推断:Kotlin可以根据初始值自动推断变量类型,所以很多时候可以省略类型声明。

val message = "Hello"  // 自动推断为String
var count = 10         // 自动推断为Int

3.3 基本数据类型

Kotlin的基本数据类型和Java类似,但有一点不同:在Kotlin里,一切皆对象。也就是说,Int、Double这些类型也是对象,它们有方法、有属性。

类型 描述 示例
Int 整型(32位) val a: Int = 100
Long 长整型(64位) val b: Long = 100L
Float 单精度浮点 val c: Float = 3.14F
Double 双精度浮点 val d: Double = 3.14159
Boolean 布尔值 val e: Boolean = true
Char 单个字符 val f: Char = 'A'
String 字符串 val g: String = "Hello"

这里有个小细节:Kotlin的Int和Java的int不一样。Java的int是基本类型,不能为null;但Kotlin的Int默认也不能为null,除非你写成Int?。这个问号就是空安全的标志。

val nullableInt: Int? = null  // 允许为null
val normalInt: Int = null     // 编译报错

我曾经在接手一个老项目时,发现代码里到处都是!!操作符(强制非空断言),那基本就是Kotlin代码的坏味道。记住:能用?就别用!!

3.4 条件控制:if 和 when

Kotlin的if和Java的if用法差不多,但有一个重要区别:Kotlin的if是表达式,不是语句。什么意思?就是if可以返回值。

// if作为表达式使用
val max = if (a > b) a else b

// 传统写法也可以
if (a > b) {
    println("a更大")
} else {
    println("b更大")
}

我个人非常喜欢这种写法,因为它让代码更紧凑。你想想看,在Java里你要写一个三目运算符a > b ? a : b,Kotlin直接用if就搞定了,而且可读性更好。

接下来是when,它是Java中switch的升级版。说实话,whenswitch强大太多了。

val score = 85
val grade = when (score) {
    in 90..100 -> "优秀"
    in 80..89 -> "良好"
    in 70..79 -> "中等"
    in 60..69 -> "及格"
    else -> "不及格"
}
println("成绩等级:$grade")

你看,when可以直接用in关键字判断范围,还能返回值。而且它不需要写break,不会像Java那样出现穿透问题。我在项目中经常用when来处理多种状态,比如网络请求的状态码、用户权限等级等,代码非常清晰。

注意:when的分支条件必须是完备的。如果可能的值没有被覆盖,必须提供else分支,否则编译会报错。

3.5 循环控制:for 和 while

Kotlin的for循环和Java差别挺大。Java里常见的for (int i = 0; i < 10; i++)这种写法,在Kotlin里被替换成了区间(Range)的概念。

// 遍历1到5
for (i in 1..5) {
    println(i)
}

// 遍历1到4(不包含5)
for (i in 1 until 5) {
    println(i)
}

// 倒序遍历
for (i in 5 downTo 1) {
    println(i)
}

// 步长为2
for (i in 1..10 step 2) {
    println(i)
}

我第一次看到这种写法时,觉得有点不习惯。但用了几次之后,发现它比Java的for循环更直观。你想想看,1..5就是1到5,downTo就是倒着来,语义非常清楚。

while循环和Java基本一样,没什么好说的。

var i = 0
while (i < 5) {
    println(i)
    i++
}

var j = 0
do {
    println(j)
    j++
} while (j < 5)

这里有个小技巧:在遍历集合时,Kotlin提供了withIndex()方法,可以同时拿到索引和值。

val list = listOf("苹果", "香蕉", "橘子")
for ((index, value) in list.withIndex()) {
    println("第${index + 1}个是$value")
}

我在处理列表数据时经常用这个,比Java里单独维护一个计数器方便多了。

3.6 本章知识体系

为了让你更直观地理解本章的知识结构,我画了一张图。你可以看到,Kotlin基础部分从变量常量出发,延伸到数据类型,再到流程控制,环环相扣。

Kotlin语言基础(上) 变量与常量 var(可变) / val(不可变) 类型推断:自动识别类型 基本数据类型 Int / Long / Float / Double Boolean / Char / String 空安全:Int? 允许为null 条件控制 if 表达式:可返回值 when 表达式:增强版switch 循环控制 for (区间/集合遍历) while / do-while 所有知识点最终服务于Android开发实战

好了,这一章的内容就到这里。Kotlin的基础语法其实不难,关键是养成好的编码习惯。下一章我们会继续深入Kotlin的函数、集合和面向对象编程,到时候你会看到更多有意思的特性。


公众号:蓝海资料掘金营,微信deep3321