Kotlin 教程 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift
一、kotlin对比java语法
1. let函数(返回值 = 最后一行 / return的表达式)
//. 作用1:使用it替代object对象去访问其公有的属性 & 方法
object.let{
it.todo()
}
// 作用2:判断object为null的操作
object?.let{//表示object不为null的条件下,才会去执行let函数体
it.todo()
}
// 例:
//kotlin
var result = mVar.let {
it.function1()
999
}
// 最终结果 = 返回999给变量result
//java
Int result(){
MVar mVar = new MVar();
mVar.function1()
return 999
}
2. also函数和let的区别
作用:类似let函数,但区别在于返回值:
- let函数:返回值 = 最后一行 / return的表达式
- also函数:返回值 = 传入的对象的本身
// also函数
//kotlin
var result = mVar.also {
it.function1()
}
// 最终结果 = 返回一个mVar对象给变量result
//java
MVar result(){
MVar mVar = new MVar();
mVar.function1()
return mVar
}
3. with函数
作用:调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可 返回值 = 函数块的最后一行 / return表达式
with(object){
// ...
}
// 此处要调用people的name 和 age属性
// kotlin
val people = People("carson", 25)
with(people) {
println("my name is $name, I am $age years old")
999
}
// Java
User peole = new People("carson", 25);
String var1 = "my name is " + peole.name + ", I am " + peole.age + " years old";
System.out.println(var1);
return 999
4. run函数(函数块的最后一行 / return表达式)
结合了let、with两个函数的作用
- 调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
- 定义一个变量在特定作用域内
- 统一做判空处理
// 此处要调用people的name 和 age属性,且要判空
// kotlin
val people = People("carson", 25)
people?.run{
println("my name is $name, I am $age years old")
}
// Java
User peole = new People("carson", 25);
String var1 = "my name is " + peole.name + ", I am " + peole.age + " years old";
System.out.println(var1);
5. apply函数
作用 & 应用场景(与run函数类似,但区别在于返回值)
- run函数返回最后一行的值 / 表达式
- apply函数返回传入的对象的本身
// run函数
val people = People("carson", 25)
val result = people?.run{
println("my name is $name, I am $age years old")
999
}
// 最终结果 = 返回999给变量result
// apply
val people = People("carson", 25)
val result = people?.apply{
println("my name is $name, I am $age years old")
999
}
// 最终结果 = 返回一个people对象给变量result
6、接口回调中Lambda使用
在Kotlin中可使用Lambda函数简化一些不必要的嵌套接口回调方法
注:仅支持单个抽象方法回调,多个回调方法不支持。
// Java接口回调
mVar.setEventListener(new ExamEventListener(){
public void onSuccess(Data data){
// ...
}
});
// 同等效果的Kotlin接口回调(无使用lambda表达式)
mVar.setEventListener(object: ExamEventListener{
public void onSuccess(Data data){
// ...
}
});
// Kotlin接口回调(使用lambda表达式,仅留下参数)
mVar.setEventListener({
data: Data ->
// ...
})
// 继续简化
// 简化1:借助kotlin的智能类型推导,忽略数据类型
mVar.setEventListener({
data ->
// ...
})
// 简化2:若参数无使用,可忽略
mVar.setEventListener({
// ...
})
// 简化3:若setEventListener函数最后一个参数是一个函数,可把括号的实现提到圆括号外
mVar.setEventListener(){
// ...
}
// 简化3:若setEventListener函数只有一个参数 & 无使用到,可省略圆括号
mVar.setEventListener{
// ...
}
7、在Kotlin中,所有的类默认都是final的。如果你需要允许它可以被继承,那么你需要使用open声明:
/**用户基类**/
open class Person{
open fun study(){ // 允许子类重写
println("我毕业了")
}
}
/**子类继承 Person 类**/
class Student : Person() {
override fun study(){ // 重写方法
println("我在读大学")
}
}
fun main(args: Array<String>) {
val s = Student()
s.study();
}
二、kotlin对比Typescript语法
1、变量定义
//kotlin
val a: Int = 1
// Typescript
val a: Int = 1
const hello : string = "Hello World!"
2、函数定义【fun和function关键字】
//kotlin
fun sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
return a + b
}
// Typescript
function sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
return a + b
}
三、kotlin对比dart(flutter)
1、未初始化的属性修饰符
late //dart 例:late String value;
lateinit //kotlin 例:lateinit var value: String
2、Kotlin扩展和dart命名构造函数对比
//kotlin
class User(var name:String)
fun User.Print(){
print("用户名 $name")
}
//dart
class DataList {
int type = 1;
DataList.fromMap(Map<dynamic, dynamic> json) {
type = json['type'];
}
}
3、空安全语法使用区别
//kotlin
var str:String = null;//错误
var str:String? = null;//正确
str!!.length //调用
//dart
String str=null;//错误
String str?=null;//正确
str!.length