Kotlin 常用语法 | 青训营

112 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

Create DTOs(POJOs/POCOs)

  • 当你需要创建一个数据类,同时需要该类实现以下方法时(这并不少见):

    • 类属性的gettersetter
    • equals()
    • hashCode()
    • toString()
    • copy()
    • componentN():一个重要的应用是:可以实现解构声明
  • data关键字声明为数据类:编译器就会自动生成上述方法

    data class ClassName(parameters)
    
  • 细节:

    • 为了保证代码一致性,数据类需要还需要满足以下的要求:
      • 主构造函数需要有最少一个参数(否则就不会生成ComponentN()
      • 主构造函数的参数,都需要被valvar修饰(为了统一)
      • 被声明为数据类的类,不能被abstractopensealedinner修饰
    • 次构造函数里的赋值不会被copy到新对象,所以要注意次构造函数里的赋值操作
  • 更多说明:参考官方文档关于Data Classes的说明

类参数的默认值

  • 如果你需要为类里面的参数,设置默认值,以防在未传响应参数时报错,就需要用到Kotlin对于类成员变量的默认值设置语法

  • 用法:

    fun ClassName(a: Int = 0, b: String = "") { ... }
    

集合过滤器(filter)

  • 当你需要对一个list中的每个成员按照一定条件进行过滤时,就需要用到Kotlin提供的filter()函数

  • 用法:

    val positives = list.filter { x -> x > 0 }
    

    or

    val positives = list.filter { it > 0 }
    
  • 注:与Java不同的不同点,参考官方文档Java与Kotlin关于Filter语法的对比

遍历Map、Pairs

  • 如果你需要对一个Map集合或者一个类型为PairList集合进行遍历时,就可以用到该语法,比Java更方便简介

  • 用法:

    for ((key,name) in map){
        println("$key -> $name")
    }
    

扩展函数

  • 当你需要觉得某个类型提供的功能不够好,并且希望为其添加特定功能时,就需要用到该语法

    fun String.spaceToCamelCase() { ... }
    "Convert this to camelcase".spaceToCamelCase()
    
  • 泛型扩展函数:

    fun <T> T.myPrintFunc(): T{
        println(this)
        return this
    }
    "abs".myPrintFunc()
    

交换两个变量的值(优雅永不过时)

  • 当你需要交互两个变量的值,但又想优雅得实现时,就可以利用also语法优雅实现

  • 用法:

    var a = 1
    var b = 2
    a = b.also { b = a }
    

TODO()函数

  • 在编写代码的过程中,当你需要先调用某个函数,但又不想马上实现时,就可以利用Kotlin提供的TODO函数,这样你就可以专注于当前逻辑代码的实现了。

  • 细节:

    • TODO()与注解的TODO的比较:

      • TODO()是能直接调用的,而且有返回值,类型为Nothing,这决定了任意类型都可以接受它
      • TODO()TODO都可以被IDEA识别到,并自动添加到TODO tool栏目中
    • TODO()有两种默认实现:

      • 有参:只有一个参数,用于说明原因,相当于自定义异常的简单使用

        fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")
        
      • 无参:没有参数,直接抛出NotImplementedError异常,说明默认为An operation is not implemented.

        fun calcTaxes(): BigDecimal = TODO()