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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!