包名
允许包名和文件路径不一致
定义方法
// 2 个 Int 参数,返回一个 Int
fun sum(a:Int, b:Int): Int{
return a+b
}
复制代码
// 一行方法体可以直接简写,不写返回值,由系统推测
fun sum(a:Int, b:Int) = a + b
复制代码
// 返回没有意义的值,返回值默认为 Unit
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
复制代码
// Unit 可以省略
fun printSum(a: Int, b: Int){
println("sum of $a and $b is ${a + b}")
}
复制代码
定义变量
// 定义只读变量
fun assignLocalVariable(){
val a:Int = 1
val b = 2 // 直接初始化具体类型可以省略
val c:Int // 没有初始化需要指定具体类型,否则会报错
c = 4
println("a = $a, b = $b, c = $c")
}
复制代码
// 定义可变变量
fun mutableVariable() {
var x = 4 // Int 类型被推测出来
x += 1
println("x = $x")
}
复制代码
// 定义全局的变量
val PI = 3.14
var x = 23
fun incrementX() {
x += 1
}
复制代码
注释
和 Java 一样,支持行尾注释和块注释。但是 Kotlin 的块注释可以嵌套。
// 行尾注释
/**
* 块注释
*/
/* 块注释
块注释 */
/* 嵌套块注释 /* 嵌套块注释 */ */
复制代码
字符串模板
// 字符串模板
// 和 groovy 一样使用 $,后面跟变量或者代码块。调用代码
fun stringTemplates(){
var a = 1
val s1 = "a is $a"
a = 2
val s2 = "${s1.replace("is","was")},but now is $a"
}
复制代码
条件语句
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
复制代码
// 可以简写成
fun maxOf(a: Int, b: Int) = if (a > b) a else b
复制代码
使用可为空的类型
// 返回值后面有个?代表返回值可能为 null,没有?则代表一定不是 null
fun parseInt(str: String): Int? {
// ...
}
复制代码
可能为 null 的情况就需要自己处理空值的情况
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
if (x == null) {
println("Wrong number format in arg1: '$arg1'")
return
}
if (y == null) {
println("Wrong number format in arg2: '$arg2'")
return
}
println(x * y)
}
复制代码
使用类型检查和自动转换
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 不需要像 java 类型强转,Kotlin 自动推测这是 String 类型
return obj.length
}
return null
}
fun getStringLength(obj: Any): Int? {
if (obj !is String) {
return null
}
// 不需要像 java 类型强转,Kotlin 自动推测这是 String 类型
return obj.length
}
fun getStringLength(obj: Any): Int? {
// 在 is 判断后面的判断都可以自动推测出 String 类型
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
复制代码
循环
for 循环
使用 in 和 index 2 种方式循环。
in 需要对象提供迭代器,类似 java foreach。
fun forLoopIn(){
val items = listOf("apple","banana","kiwi")
for (item in items){
println(item)
}
}
fun forLoopIndex(){
val items = listOf("apple","banana","kiwi")
for (i in items.indices){
println("i = $i, item = ${items[i]}")
}
}
复制代码
while 循环
while 还是和 java 一样
fun whileLoop() {
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
}
复制代码
when 选择语句
类似 switch
fun describe(obj: Any) = when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
复制代码
区间判断
检查一个数是否在一个区间里。用 in 关键字:
x..y 表示 [x,y] 的数。包括 x,y y downto x 表示从 y 到 x 开始倒序遍历
step 表示跳过几个数
fun checkNumber() {
val x = 1.2
val y = 9
// x 是否在 [1,10] 闭区间
if (x in 1..y + 1) {
println("$x fits in range")
}
}
复制代码
fun step() {
// 按 1 3 5 7 9 跳过 2 个数
for (x in 1..10 step 2) {
print(x)
}
}
fun downto(){
println()
// 9 downTo 0 是 [0,9] 的反序
for (x in 9 downTo 0 step 3) {
print(x)
}
}
复制代码
集合
// 具有迭代器对象的集合遍历。类似 foreach
for (item in items) {
println(item)
}
复制代码
// 使用 in 判断元素是否在集合中
fun checkItem() {
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}
复制代码
// 筛选出首字母 a 开头的元素,然后转成大写,打印
fun lambdaSample() {
println()
val fruits = setOf("apple", "banana", "kiwi")
fruits.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
}
复制代码
实例
创建实例不需要 new 关键字。直接是 类名()
val a = A()
复制代码