kotlin 实战之函数与 lambda 表达式总结,三年Android开发

本文详细介绍了Kotlin中的vararg参数、infix函数、inline函数提升效率、高阶函数和闭包特性,以及匿名函数的应用。同时提到了适用于不同阶段Android开发者的学习资源,包括体系化的学习路径和实战项目。
摘要由CSDN通过智能技术生成

//可变参数定义使用 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)) //普通调用

println(test add 21) //中缀调用

}

kotlin 内联函数


内联提升调用效率,但是增大了字节码体积,其优缺点及机制原理同其他语言的内联函数等价。如下案例:

inline fun add(a: Int, b: Int) = a + b

关于内联函数原理其实很简单,建议直接 javap -c 去看下字节码区别就能理解优缺点了。

kotlin 高阶函数


在一个函数参数中可以传递另一个函数作为参数,则这个函数就是高阶函数,经常使用 lambada 表达式达到这个目的,常见的 lambada 表达式定义:

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

//add变量是一个函数类型,其值等于一个 lambada 函数

val add: (Int, Int) -> Int = { a: Int, b: Int -> a + b }

//简写

val add: (Int, Int) -> Int = { a, b -> a + b }

//自动类型推断写法

val sub = { a: Int, b: Int -> a - b }

//print 变量也是一个 lambada 表达式,没有参数而已

val print = { println(“666”) }

//_ 表示是一个参数,但是参数在函数体中不会被用到

val mayNull: (Int, Int) -> Int? = { _, _ -> null }

//表示这个 lambada 表达式函数类型的变量可以为 null,这里赋值了 null

val functionMayNull: (Int, Int) -> Int)? = null

下面定义一个高阶函数及使用:

//高阶函数定义

fun funcHeight(a: Int, b: Int, calculate: (Int, Int) -> Int): Int {

return calculate(a, b)

}

/**

调用结果:

22

2

*/

fun testRun() {

val add = { a: Int, b: Int -> a + b }

println(funcHeight(12, 10, add))

println(funcHeight(12, 10) { x, y -> x - y })

}

kotlin 匿名函数


kotlin 的匿名函数主要用在 lambada 表达式中。如下案例:

fun funcHeight(a: Int, b: Int, calculate: (Int, Int) -> Int): Int {

return calculate(a, b)

}

//编译报错,匿名函数不能定义在外部 Function declaration must have a name

//fun (x: Int, y: Int) = x + y

/**

调用结果:

7

7

*/

fun testRun() {

//匿名函数

fun (x: Int, y: Int) = x + y

//lambada表达式方式

var ret = funcHeight(3, 4, { x, y -> x + y })

println(ret)

//匿名函数用在 lambada 表达式中

ret = funcHeight(3, 4, fun (x, y): Int = x + y)

println(ret)

}

kotlin 闭包


kotlin 允许在 lambada 表达式中修改外层的变量值(java 不允许,且外部变量需为 final),这种特性其实就是一种闭包特性,如下:

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

/**

调用结果:

123412345

*/

fun testRun() {

var sum = “”

val strs = arrayOf(“1234”, “123”, “12345”)

strs.filter { it.length > 3 }.forEach {

//闭包

sum += it

}

println(sum)

}

kotlin 带接收者的函数字面值


kotlin 提供了一种功能,可以通过指定的接收者对象来调用一个函数字面值。在函数字面值内部,你可以调用接收者对象的方法而无需使用任何额外的修饰符,譬如 kotlin 提供的 apply 函数机制就是通过这个实现的。这一点非常类似扩展函数。如下是一个案例:

//表示 sub 是 Int 的一个函数类型变量

val sub: Int.(arg: Int) -> Int = { arg -> this - arg }

/**

调用结果:

70

*/

fun testRun() {

//Int 类型变量才可以调用 sub 函数

println(100.sub(30))

}

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

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

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

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

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

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

自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

]
img

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-m5ngBicq-1711657153424)]

自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

[外链图片转存中…(img-6icMXtjL-1711657153425)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值