inline fun bigHigherOrderFunction(firstRunnable: () -> Unit, noinline secondRunnable: () -> Unit, thirdRunnable: () -> Unit) {
firstRunnable()
secondRunnable()
thirdRunnable()
}
fun testNoInline() {
bigHigherOrderFunction({
System.out.println(“firstRunnable”)
}, {
System.out.println(“secondRunnable”)
//return //not allowed if the lambda is noinlined
}, {
System.out.println(“thirdRunnable”)
})
}
反编译验证一下。
public final class NoinlineSampleKt {
public static final void bigHigherOrderFunction(@NotNull Function0 firstRunnable, @NotNull Function0 secondRunnable, @NotNull Function0 thirdRunnable) {
int
i
i
if$bigHigherOrderFunction = 0;
Intrinsics.checkParameterIsNotNull(firstRunnable, “firstRunnable”);
Intrinsics.checkParameterIsNotNull(secondRunnable, “secondRunnable”);
Intrinsics.checkParameterIsNotNull(thirdRunnable, “thirdRunnable”);
firstRunnable.invoke();
secondRunnable.invoke();
thirdRunnable.invoke();
}
public static final void testNoInline() {
Function0 secondRunnable$iv = (Function0)null.INSTANCE;
int
i
i
if
b
i
g
H
i
g
h
e
r
O
r
d
e
r
F
u
n
c
t
i
o
n
=
f
a
l
s
e
;
i
n
t
v
a
r
2
=
f
a
l
s
e
;
S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
f
i
r
s
t
R
u
n
n
a
b
l
e
"
)
;
s
e
c
o
n
d
R
u
n
n
a
b
l
e
bigHigherOrderFunction = false; int var2 = false; System.out.println("firstRunnable"); secondRunnable
bigHigherOrderFunction=false;intvar2=false;System.out.println("firstRunnable");secondRunnableiv.invoke();
var2 = false;
System.out.println(“thirdRunnable”);
}
注意,对于不进行inline处理的 lambda 表达式中 不允许使用return。
crossinline
但是我们使用了上面的noinline,可能还是担心一些性能问题,好在这里,还有一个叫做crossinline的东西。
- crossinline 需要配合inline一起起作用
- crossinline 限定的 lambda 不允许使用return,避免了non local control flow问题
使用示例
//crossinline必须和inline结合使用
inline fun higherOrderFunctionCrossline(crossinline runnable: () -> Unit) {
runnable()
}
fun testCrossline() {
higherOrderFunctionCrossline {
System.out.println(“testCrossline”)
// return not allowed here
}
}
再次反编译验证代码
public static final void higherOrderFunctionCrossline(@NotNull Function0 runnable) {
int
i
i
if$higherOrderFunctionCrossline = 0;
Intrinsics.checkParameterIsNotNull(runnable, “runnable”);
runnable.invoke();
}
public static final void testCrossline() {
int
i
i
if$higherOrderFunctionCrossline = false;
int var1 = false;
System.out.println(“testCrossline”);
}
Kotlin inline与 JIT inline的区别
提到inline,听说过的朋友可能第一个想到的是 JIT 的 inline。JIT inline 是JVM虚拟机提供的运行时的一种优化方式。
来一段代码举例来说
public int add(int x, int y) {
return x + y;
}
public void testAdd() {
//some code here
int result = add(a, b);
}
当JVM的JIT编译决定将add方法执行inline操作后,testAdd的方法实现会变成类似这样
public void testAdd() {
int result = a + b;
}
即 将add的方法体实现提取到调用处(testAdd方法中)。inline带来的好处也不言而喻,那就是减少了方法调用产生的进栈和出栈操作,提升运行时的效率。
Kotlin的inline作用和JIT inline大体差不多,稍有一些不同
- Kotlin的inline发生在编译时,而不是运行时
- Kotlin的inline可以明确指定,而jit inline则无法指定发生。
inline 带来的其他问题 can not access private variable
private val aPrivateValue = “A Private Value”
internal val internalValue = “Internal Value”
@PublishedApi
internal val taskId = “1”
val publicValue = “”
var publicVariable = “”
inline fun beToInlinedMethod(runnable: () -> Unit) {
//aPrivateValue //Public-API inline function cannot access non-public-API
// ‘private val aPrivateValue: String’ defined in root package in file InlineAccessPrivateMember.kt
// internalValue 同样也报错上面的错误
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
文末
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**