在 Kotlin 里,一切都是对象。
变量声明

Kotlin中使用“val”或者是“var”这样的关键字作为开头,后面跟“变量名称”,接着是“变量类型”和“赋值语句”,最后是分号结尾。


关键字 变量类型
var price: Int = 100; /*
变量名 变量值 */

在 Kotlin 当中,我们应该尽可能避免使用 var,尽可能多地去使用 val。

  • val 声明的变量,我们叫做不可变变量,它的值在初始化以后就无法再次被修改,它相当于 Java 里面的 final 变量。

  • var 声明的变量,我们叫做可变变量,它对应 Java 里的普通变量。

空安全

Kotlin 强制要求开发者在定义变量的时候,指定这个变量是否可能为 null。 数字类型 Java 可以隐式转换数字类型,而 Kotlin 更推崇显式转换。

函数声明
关键字 函数名 参数类型 返回值类型
fun helloFunction(name: String): String {
return "Hello $name !"
花括号内为:函数体

  • 使用了fun 关键字来定义函数;

  • 函数名称,使用的是驼峰命名法(大部分情况下);

  • 函数参数,是以 (name: String) 这样的形式传递的,这代表了参数类型为 String 类型;

  • 返回值类型,紧跟在参数的后面;

  • 最后是花括号内的函数体,它代表了整个函数的逻辑。

fun helloFunction(name: String): String = "Hello $name !"

这种写法,我们称之为单一表达式函数。需要注意的是,在这种情况下,表达式当中的“return”是需要去掉的。

函数调用helloFunction(name = "Kotlin")

命名参数。简单理解,就是它允许我们在调用函数的时候传入“形参的名字”。 Kotlin 还支持参数默认值。

流程逻辑判断 if

Kotlin 针对这种情况就提供了一种简写,叫做 Elvis 表达式。

fun getLength(text: String?): Int {
return text?.length ?: 0
when

多于两个分支的逻辑

val i: Int = 1

when(i) {
1 -> print("一")
2 -> print("二")
else -> print("i 不是一也不是二")
}

输出结果:

也可以作为表达式

val i: Int = 1

val message = when(i) {
1 -> "一"
2 -> "二"
else -> "i 不是一也不是二" // 如果去掉这行,会报错
}

print(message)

注意点:与 switch 不一样的是,when 表达式要求它里面的逻辑分支必须是完整的。

for循环 基础迭代遍历val array = arrayOf(1, 2, 3)
for (i in array) {
println(i)
区间val oneToThree = 1..3 // 代表 [1, 3]

for (i in oneToThree) {
println(i)
}

输出结果:
1
2
3
逆序迭代for (i in 6 downTo 0 step 2) {
println(i)
}

输出结果:
6
4
2
0
改进之处

相对Java来说,Kotlin的改进有以下几点:

  • 支持类型推导;

  • 代码末尾不需要分号;

  • 字符串模板;

  • 原始字符串,支持复杂文本格式;

  • 单一表达式函数,简洁且符合直觉;

  • 函数参数支持默认值,替代 Builder 模式的同时,可读性还很强;

  • if 和 when 可以作为表达式。

总结
  • 强制区分“可为空变量类型”和“不可为空变量类型”,规避空指针异常;

  • 推崇不可变性(val),对于没有修改需求的变量,IDE 会智能提示开发者将“var”改为“val”;

  • 基础类型不支持隐式类型转换,这能避免很多隐藏的问题;

  • 数组访问行为与集合统一,不会出现 array.length、list.size 这种恼人的情况;

  • 函数调用支持命名参数,提高可读性,在后续维护代码的时候不易出错;

  • when 表达式,强制要求逻辑分支完整,让你写出来的逻辑永远不会有漏洞。

打开网易新闻 查看精彩图片