Kotlin之路-变量与函数

虽说Kotlin与Java一样是JVM语言,并且它们都是静态言语,但是它们之间的语法差别还是挺大的,Kotlin的语法相比Java更加精简,它与Swift的语法更加相近,有人说,Kotlin就是Android界的Swift。Kotlin精简了语法,加强了安全检查,特别是变量的非空和可空声明,从编写程序阶段就尽可能避免了程序潜在的空指针异常。说到空指针异常,你是否已经多Java的判空语句厌烦了呢😭。

首先让我们再来重温经典的HelloWorld,观察如下代码,对比Kotlin和Java的区别:

Kotlin代码:

1
2
3
4
5
package com.oopsguy

fun main(args: Array<String>) {
println("Hello World")
}

Java代码:

1
2
3
4
5
6
7
8
9
package com.oopsguy;

class Main {

public static void main(String[] args) {
System.out.println("Hello World");
}

}

从肉眼上看直观地看出Kotlin的代码明显比Java的精简。在此说明的是以上都是程序的执行主入口Main方法,Java的每一个文件都要先声明一个类,所有代码文件都是基于class,而Kotlin的main方法并不需要写在class中,在Kotlin语言中,函数就是第一,可见位置很高。另外它们之间的方法声明和打印语句也有着差异,Kotlin声明一个方法或者函数用fun声明,非常短小,其自带的打印输出语句经过了封装只需要println或者print就可以快捷地输出控制台信息,经过上面两个例子的对比,我们大概了解了一下它们之间的差异,让我再更深入一点。

变量

Kotlin声明变量:

1
2
3
val a = 1
val b:Int
b = 2

val或者var关键字声明变量,这两个有点区别,val是定义一不可变的量,赋值之后是不可以改变的,对应Java的final类型,var定义之后的变量可以改变值。如果在声明变量的时候直接给变量初始化值,可以不用显式声明变量的类型,Kotlin根据变量的值类型会自定推导变量的类型。如果需要为变量声明类型,在变量后加上一个:后接类型。Kotlin推荐尽量使用val关键字声明变量,除非变量是可变的。

注意的一点是Kotlin的语句结束的时候是不需要分号结尾,当然你也可以加上,但这是多余的。

当我们尝试改变val声明的变量,IDE将会提示val声明的变量是不可以被改变的。(本人使用的是Jetbrains的IDEA)

字符串模板

拼接字符串在很多的程序都是存在的,我们需要把变量和普通的文本拼接在一起,如果变量数目很少的话,拼接是没有什么难度的,但是当变量很多的时候,在Java中需要为每一个变量都是用+符号来相加,这是一件非常麻烦的事情。

1
2
3
4
5
String a = "Hello";
String b = "W";
String v = "ld";

String wholdStr = a + " " + b + "or" + v;

Koltin提供了更好的字符串拼接方法,那就是字符串模板,我们可以在字符串中用一个$跟变量名一直的字符来占位,Kotlin会解析被占位的地方,转为变量的所代表的内容。

1
2
3
4
5
val a = "Hello"
val b = "w";
val v = "old"
val whole = "$a ${b}r$v";
print(whole)

这里需要说明的是,如果模板字符串中的变量名紧挨着字符,需要用{}把变量名包围起来,避免发生歧义,这种写法有点类似现在ES6的字符串模板。

如果需要在字符串中输出$符号,需要使用\进行转义处理,否则Kotlin会认为这是一个模板变量。

函数

从开头的例子可以看出了Kotlin的函数声明方式,其使用fun关键字声明一个函数:

1
2
3
fun func1() {
println("This is a function")
}

如果我们需要声明一个带有参数的函数:

1
2
3
fun func1(a: Int, b: String) {
println(a.toString() + b)
}

参数的类型放置跟声明变量一样,在参数的后面加一个:后接参数类型。

如果需要声明一个带有返回值的函数:

1
2
3
fun func1(a: Int, b: String): String {
return a.toString + b
}

参数声明的括号后面加上返回的参数类型即可,如果是没有返回类型,可以不用声明返回值,或者显式的声明返回值是一个Unit类型,但Kotlin官方建议没有返回值的函数不需要声明返回值类型。

1
2
3
fun func1(a: Int, b: String): Unit {
println(a.toString() + b)
}

此外,Kotlin还提供一种更为简便的函数写法,表达式写法,当函数体非常短或者只有一个语句的时候,这样的写法最合适。

一般写法:

1
2
3
fun contactStr(a: String, b: String): String {
return a + b
}

表达式写法:

1
fun contactStr(a: String, b: String): String  = a + b

与上面的普通写法对比,表达式写法把函数体精简了,直接用一个等于号指向一条语句,类似于一个表达式,而且还忽略return关键字,表达式写法会根据当前函数声明的返回值来判断是否return,但是这只适用与函数表达式。