Kotlin的优势:
Kotlin更安全: Kotlin 支持显式地声明 null,并确保开发人员不会遇到可能导致质量问题的空引用异常;
代码简洁:不需要分号、很多相同的功能去用Kotlin实现语法更简洁
函数式支持: 高阶函数
扩展函数:可以直接不需要修改某个类的源码而给这个类添加新的功能
内联函数:使用 Lambda 表达式时,这些内联函数让它比 Java 编写的代码运行得更快;
支持线程的并发协同:Kotlin中当取消一个线程执行的时候,并不会阻塞任何其他线程,Java 虽然也允许多线程在后台运行,但它的处理机制更加复杂,在处理长时间运行的网络 I/O 或 CPU 密集型任务方面,Kotlin 比 Java 更具有领先优势;
Kotlin的缺陷:
目前,它还不支持很多功能,比如静态成员、通配符类型、非私有字段、Checked Exception、原始类型以及三元运算符等等。
java项目添加kotlin
支持
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
在Kotlin中,if是有结果值的表达式,它和java中的三元运算符?类似。在Kotlin中,除了循环(for,do 和 do/while)以外的大多数控制结构都是表达式。另一方面,java的赋值操作是表达式,在Kotlin中是语句。
可以省略变量的类型,编译器会分析初始化器表达式的值,并把它的类型作为变量的类型
也可以显示的指定类型
如果变量没有初始化器,需要显示的指定它的类型
val b = "hello Kotlin"
val c : String = "hello Kotlin"
val answer : Int
可变变量和不可变变量
val(来自value)——不可变引用 | 不能在初始化之后再次赋值,对应于java中的final变量 |
var(来自variable)——可变引用 | 变量的值可以被改变。 |
注意:
应该尽可能的使用val关键字来声明所以的Kotlin变量。尽在必要时换为var
val指向的对象可能是可变的。
//这是被允许的
val languages = arrayListOf("java")
languages.add("Kotlin")
Kotlin让你可以在字符串字面值中引用局部变量,只需在变量名前加上字符$
//相当于java中的字符串拼接(“hello”+name+"!")
val name = "liming"
println("hello , $name!")
还可以引用更复杂的表达式
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
println("the max of two number is ${
max(1,2)}")
when是一个有返回值的表达式,如下写一个直接返回when表达式的表达式体函数,
对应于java中的switch语句,但你不用在每个分支上都写break语句,如果匹配成功,只有对应的分支会执行。
fun getMnemonic(color : Color) =
when (color) {
Color.BLUE -> "red"
Color.INDIGO -> "indigo"
Color.GREEN,Color.ORANGE,Color.RED ->"green" //也可以把多个值合并到一个分支
else -> "else" //相当于switch的default
}
注:Kotlin的when结构比java中的switch强大的多。when允许使用任何对象作为分支条件。
fun mix(c1 : Color, c2 : Color) =
when( setOf(c1,c2) ) {
//setOf是一个函数,可以创建一个Set,它会包含所有指定的函数实参的对象
setOf(Color.RED,Color.ORANGE) -> Color.ORANGE
setOf(Color.INDIGO,Color.GREEN) -> Color.YELLOW
else -> throw Exception("Dirty color")
}
此外还可以使用不带参数的when
fun mixOptimized(c1 : Color, c2:Color) =
when{
c1 == Color.YELLOW && c2 == Color.GREEN -> 1
else -> 2
}
is用来检查判断一个变量是否是某种类型,和java中的instanceOf类似,并且在用is检查过一个变量是否是某种类型后,后面就不再需要转换它的类型,可以就把它当作你检查过的类型使用。(事实上是编译器为你执行了类型转换)
在Kotlin中迭代的实现也是靠while和for,其中while的用法和java中基本相同,for循环不同。
区间: 本质上就是两个值之间的间隔。表示如下:
//定义区间
val oneToTen = 1..10
注意:
使用:
猜字游戏(when和for循环结合使用)
fun main(args : Array<String>){
for(i in 1..100){
println(fizzBuzz(i))
}
}
fun fizzBuzz(i : Int) = when{
i % 15 == 0 -> "FizzBuzz"
i % 3 == 0 -> "Fizz"
i % 5 == 0 -> "Buzz"
else -> "$i"
}
进阶使用:从100开始倒着计数并且只计偶数
for( i in 100 downTo 1 step 2){
//100 downTo 1是递减数列,步长为-1.step把步长的绝对值设为2
println(fizzBuzz(i))
}
注意:step必须是正的
迭代不包含结束值的半区间写法
for( x in 0 until 100){
println(fizzBuzz(x))
}
迭代map
val binaryReps = TreeMap<Char,String>() //定义map集合
for(c in 'A'..'Z'){
val binary = Integer.toBinaryString(c.toInt())
binaryReps[c] = binary //向map集合添加元素
}
for( (letter,binary) in binaryReps){
//map的迭代
println("$letter = $binary")
}
注意:
使用 in 运算符来检查一个值是否在区间内,使用 !in 来检查这个值是否不在区间内。
fun isLetter(c : Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c : Char) = c !in '0'..'9'
注: