美文网首页Kotlin开发我爱编程kotlin
Kotlin几个很有用的关键字

Kotlin几个很有用的关键字

作者: 砺剑锋成 | 来源:发表于2018-07-24 19:16 被阅读134次

    1.object 用于创建单例模式

    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
    }
    

    相关文章

      网友评论

        本文标题:Kotlin几个很有用的关键字

        本文链接:https://www.haomeiwen.com/subject/kpvymftx.html