Kotlin笔记1-变量和流程控制
历史:2011年7月,JetBrains推出Kotlin项目
2016年2月15日,Kotlin V1.0发布
2017年 Google I/O大会,Kotlin成功官方Android开发语言。
建议学习网站:kotlin中文网: https://www.kotlincn.net/
官网: http://kotlinlang.org/
官方在GitHub上的文档说明:https://github.com/JetBrains/kotlin/tree/master/spec-docs
《Kotlin 极简教程》一书,作者在GitHub上有各个chapter的电子版,如第三章:
https://github.com/EasyKotlin/chapter3_kotlin_basics
废话不多说,直接开讲。
1. package
(1)和java 相同的package 和 import 关键字。但是其中有一点区别:
可以看到包名 != 文件夹路径,文件名!=类名(当你你也可以相同。)对于某些时候的文件组织可能有些作用,但是大多数情况下我们还是默认使用java的路径规则。
import 可以使用一个as关键字对类进行重命名
import bar.Bar as bBar // bBar stands for 'bar.Bar’
(2)使用import导入类,或者包级函数(kotlin 中函数是一等公民,可以直接位于一个文件.kt 中),在同一个package里,可以不用导入,直接调用
import 可以使用一个as关键字对类进行重命名 import bar.Bar as bBar // bBar stands for 'bar.Bar’
(3)如果不定义package,默认是在根级目录。
2. 变量
(1)var 可写,val是只读,建议尽量使用val
(2)编译器可以推断类型,多数情况,不用指定类型 val str : String = "abc"
( 语句后可不加;)
可以直接写成val str = "abc"
(3)使用is
代替Java中使用的instance of
(4)应用字符串的值,可以使用美元符号($)
(5)变量分为三种
class ClassNew{
var a:String = "你好" //成员变量
fun print(){
var b : String = "kotlin" //本地变量
Log.d("sss",a + b +c)
c = "我是程序猿2"
}
}
var c : String = "我是程序猿" //全局变量
成员变量和全局变量需要在定义的时候进行初始化(成员变量可以使用lateinit 延迟初始化,后面会介绍), 而本地变量只需要保证在使用前初始化即可。
这里插播一点,如果想看kotlin代码对应的Java代码,
可以直接在Intellij IDEA 里,按快捷键 ctrl+shift+A
MAC的话,按快捷键Command(⌘) + Shift (⇧) + A,输入选择Kotlin Bytecode,然后点击Decompile就可以看到反编译后的Java代码,如下图所示:
fun main(args: Array) {
Hi(“cyc”)
print(“Hello World”)
println()
}
3. 流程控制语句
(1)if 是一个表达式,()中的表达式只能是布尔值,条件体里只有一条语句时,{ }可省略,建议加上 val max = if(a > b) a else b
(2)when表达式
when类似于switch-case表达式,像if一样,when的每一个分支也可以是一个代码块,它的值是块中最后的表达式的值。else类似于default,其中多个相同处理逻辑的分支可以用逗号分隔,可以结合(in) 和(!in)来检测一个值是否在一个区间或者集合中。
fun switch(x: Int) {
val s = "123"
when (x) {
-1, 0 -> print("x == -1 or x == 0")
1 -> print("x == 1")
2 -> print("x == 2")
8 -> print("x is 8")
parseInt(s) -> println("x is 123")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
}
val x = 1
val validNumbers = arrayOf(1, 2, 3)
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
when结合lambda表达式,可以进一步简化代码:
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
override fun compareTo(other: MyDate) =
when {
this.year != other.year -> this.year - other.year
this.month != other.month -> this.month - other.month
else -> dayOfMonth - other.dayOfMonth
}
}
fun compare(date1: MyDate, date2: MyDate) = date1 < date2