学习kotlin第11天_函数和lambda表达式

谁践踏了优雅 2022-06-14 01:39 289阅读 0赞

继续浏览,只能说是继续浏览了,根本就不是踩坑嘛,都踩不平。

坑1、第一天就见到fun关键字了,结果现在才告诉我这是声明函数,调用使用传统的“变量名=函数名(参数)”,调用成员函数用“点表示法”,参数列表用“name:type=value”表示法并用逗号隔开。这文档,已经无力吐槽。

坑2、中缀表示法调用函数时函数需要满足是成员函数或者扩展函数、只有一个参数、用infix标注。

  1. infix fun Int.sss(x: Int): Int {
  2. return x+this
  3. }
  4. fun main(args: Array<String>) {
  5. 3 sss 2// 用中缀表示法调用扩展函数
  6. 3.sss(2) // 等同于这样
  7. println(3 sss 2)
  8. }

其中,3需要和函数所扩展的对象同类型,在该函数中可以用this取得,2为参数x。

坑3、override标记的函数参数列表不能有默认值。

坑4、使用默认参数调用函数时,需按顺序传入最后一个无默认值的参数及其之前的所有参数。如下:需按序传入other及其之前的参数。故建议把有默认值的参数靠后,无默认值的靠前,以便调用。当然,也可以在调用时指定参数名,这样就不用管顺序了。

  1. fun reformat(str: String = "",
  2. normalizeCase: Boolean = true,
  3. upperCaseFirstLetter: Boolean = true,
  4. divideByCamelHumps: Boolean = true,
  5. other: Int,
  6. wordSeparator: Char = 'c') {
  7. }
  8. fun main(args: Array<String>) {
  9. reformat("", true, true, true, 10)
  10. reformat(other = 10, str = "")
  11. }

坑5、函数返回值为Unit类型时可以不声明并且省略return关键字。反之,其它具有块代码体的函数都得显示指定返回类型,因为kotlin不推断具有块代码体的返回类型。

坑6、单表达式函数可以省略花括号,如返回值类型可推断时可以省略返回值声明。

  1. fun double(x: Int) = x * 2

坑7、可以用vararg定义可变参数。在下面的demo中,可变参数为数组,故如果已经定义好一个数组,可使用伸展操作符*直接传入。此外,若有多个参数,使用命名参数语法传入。

  1. fun <T> asList(vararg ts: T, sa: Int): List<T> {
  2. val result = ArrayList<T>()
  3. for (t in ts) // ts is an Array
  4. result.add(t)
  5. return result
  6. }
  7. fun main(args: Array<String>) {
  8. val list = asList(1, 2, 3, sa = 100)
  9. val a = arrayOf(1, 2, 3)
  10. val list2 = asList(4, 5.6, *a, sa = 100)
  11. }

坑8、在前面提到过,kotlin的函数不依靠于类,可以在顶层也可以声明在局部作用域作为成员函数或者扩展函数。局部函数可以访问外部函数的局部变量。

坑9、成员函数是定义在类或者对象内的函数,用“点表示法”来调用。

坑10、泛型函数在函数名前用尖括号声明。

  1. fun <T> singletonList(item: T): List<T> {
  2. return listOf(item)
  3. }
  4. 11 、尾递归函数用tailrec标记。。。不懂,递归就递归嘛,还来个啥子尾递归。

坑12、高阶函数是将函数作为参数或者返回值的函数。调用时使用“::”操作符进行调用或者传入一个lambda表达式。

  1. fun <T> lock(lock: Lock, body: () -> T): T {
  2. lock.lock()
  3. try {
  4. return body()
  5. } finally {
  6. lock.unlock()
  7. }
  8. }

坑13、lambda表达式总是被大括号括着。(哟呵,终于开始介绍lambda表达式了)

坑14、如果函数最后一个参数为lambda表达式,可以在圆括号以外指定它。

坑15、如果函数字面值只有一个参数,那么可以省略声明并用“it”来指代。

坑16、下划线用于未使用的变量的地方。

额。。。这天气太热了,一不小心就睡着了,醒来都头晕乎乎的,后面的一句话也描述不上来,等明天再看一遍。。。

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 函数(Lambda)表达式学习

    引言 在写多线程代码的时候我们往往为了实现多线程程序就不得不创建一些匿名内部类,但创建匿名内部类不是目的,我们的目的是为了实现多线程程序而不是为了实现匿名内部类,所以在这

    相关 学习kotlin

    今天继续跟着kotlin官方文档踩坑,还是那句话,仅为记录我的学习过程,不喜勿喷。 这文档顺序感觉好乱呀,东一句西一句的,还好心地给我加了引用。。。不管了,就按前后顺序来继续