基础语法
常量和变量
- 可变变量定义:var
- 不可变变量定义:val,只能赋值一次的变量(如Java 中 final 修饰的变量)
常量与变量可没有初始化值,在引用前必须初始化
编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断
var <标识符> : <类型> = <初始化值>
val <标识符> : <类型> = <初始化值>
var x = 6 // 系统自动推断变量类型为Int
x += 1 // 变量可修改
val a: Int = 1
val b = 1 // 系统自动推断变量类型为Int
val c: Int // 如果不在声明时初始化则必须提供变量类型
c = 1 // 明确赋值
非空判断
Java中比较多的判空:
// 方法调用
if (a != null) {
a.b();
}
// 变量赋值
String b = "";
if (c != null) {
b = c.d();
}
Kotlin可以大幅度的省略这部分代码
- 类型非空
var temp: String? = null
当一个变量申明时,如果变量类型后面携带了?,或者类型推导时发现内容可能为null,那么就会在调用时直接报错或者发出警告。提示你对象可能为null,怎么调用这些可能为null的对象,是下一个标题的内容。
相反的,如果申明时没有携带?,那么它就认为这个变量是不能赋值为null的,如果你在后续的赋值中,赋值了null,就会自己报错,连编译都过不了,就算侥幸骗过了编译,也会在运行时赋值为null的时候直接报错。
这样可以一定程度上避免代码单元内的空指针问题,也可以一定程度尽早发现空指针问题,同样,也少了很多的非空判断。
- 空判定
一个可能为null的对象怎么使用?加if?不用,可以直接这样写:
下面列举了三种常见的场景。
对于对象的方法调用,直接加上一个?即可,等价于上面的if中调用。
对于参数的赋值,可以在后面添加默认值,使用的是?:。
对于方法内的参数判断,可以直接使用像是赋值一样的写法,然后执行return操作。
// 方法调用
a?.b();
// 变量赋值
val b = c?.d()?:"";
// 参数判断
fun test(a: A?) {
a?:return
...
}
字符串模板
- $ 表示一个变量名或者变量值
- $name表示变量值
- ${name.fun()} 表示变量的方法返回值
var a = 1
val str = "a is $a"
a = 2
val str2 = "${str.replace("is", "was")}, but now is $a"
print str2
a was 1,but now is 2
类型检测与自动类型转换
is 运算符检测表达式是否某类型的一个实例 (如 Java 中的 instanceof 关键字)
val a = "This is a"
if (a is String) {
print("that is true")
} else {
print("that is false")
}
区间
区间表达式由具有操作符形式 … 的 rangeTo 函数辅以 in 和 !in 形成
for (x in 1..10 step 3) {
print(x+" ")
}
1 4 7 10
函数定义
// 函数定义格式: fun,参数格式为:参数 : 类型
fun sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
return a + b
}
// 表达式作为函数体,返回类型自动推断:
fun sum(a: Int, b: Int) = a + b
public fun sum(a: Int, b: Int): Int = a + b // public 方法则必须明确写出返回类型
// 无返回值的函数(类似Java中的void):
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
// 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
public fun printSum(a: Int, b: Int) {
print(a + b)
}
lambda(匿名函数)
fun main(args: Array<String>) {
val lambdaExample: (Int, Int) -> Int = {x,y -> x - y}
println(lambdaExample(3,1)) // print 2
}
可变参数长度
变长参数可用 vararg 关键字标识
fun example(vararg v:Int){
for(i in v){
print(i)
}
}
fun main(args: Array<Int>) {
example(1,2,3,4,5,6,7) // 输出1234567
}