Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇
Kotlin内置标准函数let的原理是什么?
这道题想考察什么?
- 是否了解Kotlin内置标准函数let的原理是什么与真实场景使用,是否熟悉Kotlin内置标准函数let的原理是什么本质?
考察的知识点
- Kotlin内置标准函数let的原理是什么的概念在项目中使用与基本知识
考生应该如何回答
1.你工作这么些年,let内置标准函数一般用的很频繁吧,let的原理是什么?
答:
使用端的感受:
1.在使用的时候,任何的类型,都可以.let出来使用,这是为什么呢? 因为标准let内置函数内部对泛型进行了let函数扩展,意味着所有的类型都等于泛型,所以任何地方都是可以使用let函数的。
2.所有类型.let {} 其实是一个匿名的Lambda表达式,Lambda表达式的特点是,最后一行会自动被认为是返回值类型,所以在表达式返回Boolean,那么当前的let函数就是Boolean类型,以此类推。
fun main() {
val r1 = "Derry".let {
true
it.length
}
println(r1)
val r2 = 123.let {
999
"【${it}】"
}
println(r2)
}
根据上面分析的两点使用感受,来分析他的原理:
1.inline : 是因为函数有lambda表达式,属于高阶函数,高阶函数规范来说要加inline
2.<T, R> T.let : T代表是要为T而扩展出一个函数名let(任何类型都可以 万能类型.let), R代表是Lambda表达式最后一行返回的类型
3.block: (T) -> R : Lambda表达式名称block 输入参数是T本身 输出参数是R 也就是表达式最后一行返回推断的类型
4.: R { : R代表是Lambda表达式最后一行返回的类型,若表达式返回类型是Boolean, 那么这整个let函数的返回类型就是Boolean
// inline : 是因为函数有lambda表达式,属于高阶函数,高阶函数规范来说要加inline
// <T, R> T.let : T代表是要为T而扩展出一个函数名let(任何类型都可以 万能类型.let), R代表是Lambda表达式最后一行返回的类型
// block: (T) -> R : Lambda表达式名称block 输入参数是T本身 输出参数是R 也就是表达式最后一行返回推断的类型
// : R { : R代表是Lambda表达式最后一行返回的类型,若表达式返回类型是Boolean, 那么这整个let函数的返回类型就是Boolean
inline fun <T, R> T.let(block: (T) -> R): R {
println("你${this}.let在${System.currentTimeMillis()}这个时间点调用了我")
/*contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}*/
// 调用Lambda表达式
// 输入参数this == T == "Derry" / 123,
// 输出参数:用户返回String类型,就全部是返回String类型
return block(this)
}
总结:Kotlin内置标准let函数,运用了 高阶函数特性与Lambda,控制环节交给用户完成,用户在自己的Lambda表达式中,若返回Boolean,整个let函数 与 Lambda返回 都全部是Boolean
为了保证所有的类型都能正常使用let,给泛型增加了扩展函数let,所以所有的地方都可以使用let函数。
Kotlin语言的run高阶函数的原理是什么?
这道题想考察什么?
- 是否了解Kotlin语言的run高阶函数的原理是什么与真实场景使用,是否熟悉Kotlin语言的run高阶函数的原理是什么本质?
考察的知识点
- Kotlin语言的run高阶函数的原理是什么的概念在项目中使用与基本知识
考生应该如何回答
1.你工作这么些年,Kotlin语言提供的高阶run函数一般用的很频繁吧,run的原理是什么?
答:
run在Kotlin语法中使用端的感受:
1.在使用的时候,任何的类型,都可以.run出来使用,这是为什么呢? 因为标准run内置函数内部对泛型进行run函数扩展,意味着所有的类型都等于泛型,所以任何地方都是可以使用run函数的。
2.所有类型.run{} 其实是一个匿名的Lambda表达式,Lambda表达式的特点是,最后一行会自动被认为是返回值类型,例如在表达式返回Boolean,那么当前的run函数就是Boolean类型,例如在表达式返回Int类型,那么当前的run函数就是Int类型,以此类推。
fun main() {
val r1 : Int = "Derry".run {
true
length
}
println(r1)
val r2 : String = 123.run {
999
"【${it}】"
}
println(r2)
}
根据上面分析的两点使用感受,来分析他的原理:
1.inline : 是因为函数有lambda表达式,属于高阶函数,高阶函数规范来说要加inline
2.<T, R> T.run : T代表是要为T而扩展出一个函数名run(任何类型都可以 万能类型.run), R代表是Lambda表达式最后一行返回的类型
3.block: T.() -> R : Lambda表达式名称block 输入参数是T本身 输出参数是R 也就是表达式最后一行返回推断的类型
4.: R { : R代表是Lambda表达式最后一行返回的类型,若表达式返回类型是Boolean, 那么这整个run函数的返回类型就是Boolean
5.T.() 是让lambda表达式里面持有了this(run函数), (T) 是让lambda表达式里面持有了it(let函数)
/*
1.inline : 是因为函数有lambda表达式,属于高阶函数,高阶函数规范来说要加inline
2.<T, R> T.run : T代表是要为T而扩展出一个函数名run(任何类型都可以 万能类型.run), R代表是Lambda表达式最后一行返回的类型
3.block: T.() -> R : Lambda表达式名称block 输入参数是T本身 输出参数是R 也就是表达式最后一行返回推断的类型
4.: R { : R代表是Lambda表达式最后一行返回的类型,若表达式返回类型是Boolean, 那么这整个run函数的返回类型就是Boolean
5.T.() 是让lambda表达式里面持有了this(run函数), (T) 是让lambda表达式里面持有了it(let函数)
*/
public inline fun <T, R> T.run(block: T.() -> R): R {
println("你${this}.run在${System.currentTimeMillis()}这个时间点调用了我")
/*contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}*/
// 调用Lambda表达式
// 输入参数this == T == "Derry" / 123,
// 输出参数:用户返回String类型,就全部是返回String类型
return block()
}
总结:Kotlin内置标准run函数,运用了 高阶函数特性与Lambda,控制环节交给用户完成,用户在自己的Lambda表达式中,若返回Boolean,整个run函数 与 Lambda返回 都全部是Boolean
为了保证所有的类型都能正常使用run,给泛型增加了扩展函数run,所以所有的地方都可以使用run函数。
由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~
PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)
目录
第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机
第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面
第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?
第四章 Flutter高频面试题
- Dart部分
- Flutter部分
第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串
第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析