Kotlin几个很有用的关键字

 

object Resource {
    val name = "Rocker"
}

2.lazy 、lateinit 用于延迟初始化,第一次使用时再实例化

val name: String by lazy {
    "Rocker"
}

lateinit var name:String;
fun testName(){
  name = "Rocker"
}
两者区别:
by lazy  修饰val的变量
lateinit 修饰var的变量,且变量是非空的类型

3.when 用于判断 相当于java中的switch()语句

fun getName(age: Int) = when (age) {
        12 -> "jim"
        18 -> "lili"
        else -> "Rocker"
 }

4.let 默认当前这个对象作为闭包的it参数,返回值是函数里面最后一行

fun testLet(){
       "Rocker".let {
           print(it)
           print(it)
       }
   }

5.apply 调用对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象

 fun testApply(){
        mutableListOf<String>().apply {
            add("jim")
            add("lili")
            add("Rocker")
        }.add("To test whether returns this object")
  }

6.with函数是一个单独的函数,返回是最后一行,可以直接调用对象的方法,感觉像是let和apply的结合。

 fun testWith(){
        with(mutableListOf<String>()){
            this.add("jim")
            add("lili")
            add("Rocker")
            this
        }.add("To test whether returns this object")
  }

7.open 与java 中的 final相反:它允许别的类继承这个类。默认情形下,kotlin 中所有的类都是 final ,用来表示他可以被继承。

  1. 修饰类:表示可以被继承

    open class Base(p: Int)
    
    class Child(p: Int) : Base(p)
    
  2. 修饰成员 : 表示可以复写,在 kotlin 中坚持做明确的事

    open class Base {
        open fun getName() {}
        fun getAge() {}
    }
    
    class Child() : Base() {
        override fun getName() {}
    }
    

注:abstract 抽象类或者方法默认是带着的open

8.companion object 伴随对象

在 kotlin 中不像 java ,它没有静态方法。在大多数情形下,建议只用包级别的函数。如果你要写一个没有实例类就可以调用的方法,但需要访问到类内部(比如说一个工厂方法),你可以在你的类中声明一个伴随对象,这样你就可以像 java那样把它当做静态方法调用。

interface TestCompanion {

    companion object {
        const val HOST = "http://www.baidu.com"
        const val VERSION = "1.0"
    }
}

9.is 类型检测及自动类型转换

使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // 做过类型判断以后,obj会被系统自动转换为String类型
    return obj.length 
  }

  //在这里还有一种方法,与Java中instanceof不同,使用!is
  // if (obj !is String){
  //   // XXX
  // }

  // 这里的obj仍然是Any类型的引用
  return null
}

或者

fun getStringLength(obj: Any): Int? {
  if (obj !is String)
    return null
  // 在这个分支中, `obj` 的类型会被自动转换为 `String`
  return obj.length
}

甚至还可以

fun getStringLength(obj: Any): Int? {
  // 在 `&&` 运算符的右侧, `obj` 的类型会被自动转换为 `String`
  if (obj is String && obj.length > 0)
    return obj.length
  return null
}

操作符this/it返回值
let it 最后一行或者return指定的表达式
with it 最后一行或者return指定的表达式
run this 最后一行或者return指定的表达式
also this 上下文对象
apply this 上下文对象
 
posted @ 2022-03-11 15:54  新感觉  阅读(201)  评论(0编辑  收藏  举报