初入Kotlin

361 阅读4分钟

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函数,但区别在于返回值:

  1. let函数:返回值 = 最后一行 / return的表达式
  2. 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两个函数的作用

  1. 调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
  2. 定义一个变量在特定作用域内
  3. 统一做判空处理
// 此处要调用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
 

结尾

浅尝kotlin粗略对比各语言之间点点差异