kotlin 默认参数函数


在 kotlin 中调用 java 方法时不能使用具名参数语法,因为 java 字节码并不总是会保留方法参数信息。kotlin 默认参数函数的定义与使用案例如下:

//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】

//重载一个 test 方法

fun test() = println(“other test”)

fun test(a: Int = 0, b: Int = 1, c: String = “666”) = println(“ a a ab$c”)

/**

调用结果:

other test

121666

012666

121ccc

*/

fun testRun() {

test() //调用了重载的无参 test 方法

test(12)

test(b = 12) //具名参数调用方式

//编译报错 Type mismatch. Required: Int Found: String

//test(“888”)

test(a=12, c=“ccc”)

}

对于重写的方法来说,子类所拥有的重写方法会使用与父类相同的默认参数值。在重写一个拥有默认参数值的方法时,方法签名中必须要将默认参数值省略掉。如下案例:

open class AnimBase {

open fun test(a: Int, b: Int = 1, c: String = “666”) = println(“ a a ab$c”)

}

class AnimDog: AnimBase() {

override fun test(a: Int, b: Int, c: String) {

super.test(a, b, c)

}

//重写方法不允许为参数值指定默认值,无论这里 a 或者 b 都不行

//编译报错 An overriding function is not allowed to specify default values for its parameters

//override fun test(a: Int = 1, b: Int = 1, c: String) {

// super.test(a, b, c)

//}

}

/**

调用结果:

121666

*/

fun testRun() {

val anim = AnimDog()

anim.test(a = 12)

}

kotlin lambda 表达式


kotlin 中 lambada 表达式整体和 java 很像,但也有自己的特殊。kotlin lambada 表达式格式要求如下:

  • 一个 lambada 表达式总是被一个花括号所包围。

  • 其参数(如果存在)位于->之前,参数类型是可以省略掉的。

  • 执行体位于->之后。

默认情况下,lambada 表达式中最后一个表达式的值会隐式作为该 lambada 表达式的返回值。我们可以通过全限定的语法来限定从 lambada 表达式返回值。如下案例:

//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】

//compute 是定义的一个 lambada 表达式参数

fun testLambada(i: Int = 1, j: Int = 1, compute: (x: Int, y: Int) -> Unit) {

compute(i, j)

}

fun callBack(a: Int, b: Int): Unit {

println(“a= a , b = a, b= a,b=b”)

}

/**

调用结果:

1 - 1 = 0

2 + 4 = 6

a=2, b=6

*/

fun testRun() {

testLambada { x, y -> println(“$x - $y = ${x - y}”) }

testLambada(2, 4) { x, y -> println(“$x + $y = ${x + y}”) }

testLambada(2, 6, ::callBack)

}

再来看一个例子:

fun test1(num: Int, exec: () -> Unit) {

exec()

}

fun test2(num: Int, exec: (i: Int) -> Unit) {

exec(num)

}

fun test3(num: Int, exec: (i: Int, j: Int) -> Unit) {

exec(num, 3)

}

fun main() {

test1(2) {

//这里没有 $it

println(“666”)

}

//当只有一个参数时此时会隐式传递 it 参数

test2(3) {

println(“777 $it”)

}

//多个参数时必须显式指定

test3(4) { _, _ ->

println(“888”)

}

}

kotlin 可变参数函数


一个方法中只允许一个有一个可变参数定义,且通常位于参数列表最后一个。如果可变参数不是最后一个参数,那么其后的参数都需要通过具名参数形式传递,如果其后的参数是函数类型,还可以在圆括号外传递 lambada 表达式来实现而不用指定具名。如下案例:

//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】

//可变参数定义使用 vararg

fun testArgs(vararg strs: String) {

println(strs.javaClass) //字符串数组类型

strs.forEach { println(it) }

}

/**

调用结果:

class [Ljava.lang.String;

666

777


class [Ljava.lang.String;

11

22

*/

fun testRun() {

testArgs(“666”, “777”)

println(“------------”)

val args1 = arrayOf(“11”, “22”)

//编译报错 Type mismatch. Required: String Found: kotlin.collections.ArrayList /* = java.util.ArrayList */

//testArgs(args1)

//使用分散运算符*才可以

testArgs(*args1)

}

kotlin 中缀符号(infix notation)


kotlin 的函数还可以通过中缀符号来调用,需要满足如下三个条件:

  • 是成员函数或者扩展函数。

  • 拥有单个参数。

  • 声明时使用 infix 关键字。

如下是一个案例:

class InfixT (private var age: Int) {

infix fun add(num: Int) = this.age + num

}

/**

调用结果:

24

33

*/

fun testRun() {

val test = InfixT(12)

//如下两种调用等价,常出现在 kotlin 底层库中

println(test.add(12)) //普通调用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:
[外链图片转存中…(img-m3n5z2DP-1712652500170)]

[外链图片转存中…(img-mZDQ4Pvm-1712652500171)]

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-saZEu9L6-1712652500171)]

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐