Kotlin学习手记——表达式、运算符重载、lambda表达式、中缀表达式(1)

return this.windowed(right.length, 1, transform = {

it == right

}).count { it }

}

fun main() {

val value = “HelloWorld World”

println(value - “World”)

println(value * 2)

val star = “*”

println(“*” * 20)

println(value / 3)

println(value / “l”)

println(value / “ld”)

}

重载运算符的定义特点就是类定义扩展方法,方法名和运算符对应的描述,可以到前面的网址上查,然后方法前面加 operator 关键字。

定义hascode和euqals方法:

class Person(val age: Int, val name: String){

override fun equals(other: Any?): Boolean {

val other = (other as? Person)?: return false

return other.age == age && other.name == name

}

override fun hashCode(): Int {

return 1 + 7 * age + 13 * name.hashCode()

}

}

与java一样,如果是添加到哈希一类的数据结构中,必须重写equals和hascode方法,如果equals方法判断相同,则认为是同一个对象。

val persons = HashSet()

(0…5).forEach {

persons += Person(20, “Benny”)

}

println(persons.size) //打印出1

lambda表达式

  • kotlin里面的lambdas表达式是一个匿名函数的语法糖,因此它的类型其实就是对应的函数类型

  • java中的lambdas表达式其实是接口类型的一个语法糖,二者不同

//函数类型是 () -> Unit

val func: () -> Unit = fun() {

println(“Hello”) //最后一行是函数的返回值

}

val lambda: () -> Unit = {

println(“Hello”)

}

//函数类型是 (Int) -> String

val f1 = { p: Int ->

println§

“Hello” //最后一行是函数的返回值

}

println(f1(1))

kotlin中lambda表达式中最后一行的类型就是函数的返回类型

中缀表达式

在这里插入图片描述

kotlin中比较奇怪的一种写法

val map = mutableMapOf(

“Hello” to 2,

“World” to 3

)

2 to 3

2.to(3)

println(“HelloWorld” rotate 5)

infix fun String.rotate(count: Int): String {

val index = count % length

return this.substring(index) + this.substring(0, index)

}

本质还是类的扩展方法,前面加 infix 关键字,可能是为了实现更加语义化的书写方式

class Book

class Desk

infix fun Book.on(desk: Desk){

}

val book = Book()

val desk = Desk()

book on desk

高阶函数

高阶函数简单来说就是函数的参数可传递另一个函数,常见于forEach表达式:

val intArray = IntArray(5){ it + 1 }

intArray.forEach {

println(it)

}

intArray.forEach(::println)

intArray.forEach {

println(“Hello $it”)

}

例子:定义一个函数打印方法的耗时

fun cost(block: () -> Unit) {

val start = System.currentTimeMillis()

block()

println(“${System.currentTimeMillis() - start}ms”)

}

//返回值是一个lambda表达式,也是高阶函数

fun fibonacci(): () -> Long {

var first = 0L

var second = 1L

return {

val next = first + second

val current = first

first = second

second = next

current

}

}

调用:

cost {

val fibonacciNext = fibonacci()

for (i in 0…10) {

println(fibonacciNext())

}

}

显然在java中这样是做不到的,必须每个方法里面前后去打印印一下才行。。

内联函数

添加inline关键字的函数标记为内联函数,内联函数的特点是,代码会被直接插入到调用处,编译的代码反编译结果就是代码直接插入到调用处的效果。内联函数效率高一些。

val intArray = IntArray(5){ it + 1 }

intArray.forEach {

println(it)

}

forEach在kotlin中的实现就是内联函数:

public inline fun IntArray.forEach(action: (Int) -> Unit): Unit {

for (element in this) action(element)

}

高阶函数搭配内联函数使用更加高效:

inline fun cost(block: () -> Unit) {

val start = System.currentTimeMillis()

block()

println(System.currentTimeMillis() - start)

}

cost {

println(“Hello”)

}

编译后等价于:

val start = System.currentTimeMillis()

println(“Hello”)

println(System.currentTimeMillis() - start)

内联函数的返回:

val ints = intArrayOf(1, 2, 3, 4)

ints.forEach {

if(it == 3) return@forEach

println(“Hello $it”)

}

其实是跳过3并不是返回,等价于:

for (element in ints) {

if(element == 3) continue

println(“Hello $element”)

}

  • nonLocalReturn 返回调用的方法,下面直接返回main方法

inline fun nonLocalReturn(block: () -> Unit){

block()

}

fun main() {

nonLocalReturn {

return

}

}

  • 禁止non-local-return,使用crossinline 关键字

public inline fun IntArray.forEach(crossinline action: (Int) -> Unit): Unit {

for (element in this) action(element)

}

关于non-local-return其实还是有点难理解的

  • 内联属性:

var pocket: Double = 0.0

var money: Double

inline get() = pocket

inline set(value) {

pocket = value

}

在这里插入图片描述

在这里插入图片描述

fun main() {

val person = Person(“benny”, 20)

person.let(::println)

person.run(::println)

val person2 = person.also {

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

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

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

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

081)]

【延伸Android必备知识点】

[外链图片转存中…(img-w0BstbuP-1714505807082)]

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值