Kotlin基本

1、继承与构造函数

Kotlin中默认类不可以被继承,使用open关键字之后才可以被继承。

1
2
3
4
5
// 父类
open class Person{}

// 子类继承父类
class Studen : Person() {}

Kotlin将构造函数分成了两种:主构造函数和次构造函数。

Kotlin规定,当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)

1
2
3
4
5
6
7
8
9
10
// 父类
open class Person(val name:String, val age: Int){}

// 带参数的主构造函数
class Student(val sno: String, val grade: Int, name, age) : Person(name, age) {}

// 次构造函数
class Student(val sno: String, val grade: Int, name, age) : Person(name, age) {
constructor(name:String, age:Int) : this("",0, name, age)//this关键字调用了主构造函数
}
2、接口

Kotlin中的接口与java类似,Kotlin允许对接口中定义的函数进行默认实现(Java 8后开始支持。

3、数据类与单例类

数据类关键字data,Kotlin将Java中equals()、hashCode()、toString()等固定且无实际逻辑意义的方法自动生成。

1
data class User{}

单例类,使用关键字object即可。

1
object Singleton{}

Lambda基本

1 List, Set, Map的构建

Kotlin可以采取Java的方式创建,也可以使用函数来创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
val list = ArrayList<String>()
list.add("Apple")
list.add("Banana")
list.add("Orange")

// 静态列表创建
val list = listOf("apple", "banana", "pear")
// 动态列表创建
val list = mutableListOf("apple", "banana", "pear")

// 静态集合创建
val list = setOf("apple", "banana", "pear")
// 动态集合创建
val list = mutableSetOf("apple", "banana", "pear")

// 静态Map创建
val list = mapOf("apple" to 1, "banana" to 2, "pear" to 3)
// 动态Map创建
val list = mutableMapOf("apple" to 1, "banana" to 2, "pear" to 3)
2 集合的函数式API

Lambda表达式的语法结构:{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}

1
2
3
4
5
6
7
8
// 水果集合里面找到单词最长的那个水果
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")

val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })
// 当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面
val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }
// 如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略:
val maxLengthFruit = list.maxBy { it.length }

list还有更多函数式API,例如.filter .map .any .all

3 Java函数式API的使用

以android中的button为例:

1
2
3
4
5
6
7
8
9
10
11
// java
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
// java Lambda
button.setOnClickListener(view->{});
//kotlin Lambda
button.setOnClickListener {
}
4 空指针检查

Kotlin默认所有的参数和变量都不可为空,可以声明为空,在类名的后面加上?Int? String? 然后要把空指针异常都处理掉。

判空辅助工具 ?.?:

1
2
3
4
5
6
if (a != null) {a.doSomething()}
//等价于
a?.doSometing()
val c = if (a ! = null) { a } else { b }
//等价于
val c = a ?: b

let函数,let函数属于Kotlin中的标准函数

1
2
3
4
5
obj.let { obj2 -> obj2.doSomething() }
// Lambda
obj.let { it.doSometing() }
// obj判null
obj?.let { it.doSomething() }

Kotlin中的实用小技巧

字符串内嵌表达式

与JavaScript中类似

1
2
3
"hello, ${obj.name}. kotlin!"
// 表达式中仅有一个变量的时候,还可以将两边的大括号省略
"hello, $name. kotlin"