我使用Kotlin已经有一段时间了,我偶然发现只有高阶函数才能成为内联函数,这是合理的,但我想问的问题是,它是否总是必要的

  1. 我们应该用一个lambda来构造所有的高阶函数吗? 参数,还是内联函数?
  2. 如果我们应该或不应该,为什么我们应该和为什么不应该?
  3. 我知道一种尺码不能适合所有人,那么哪种情况适合内联,哪种不适合?

推荐答案

回答您的问题:

AD.1 与编程中的一切一样,这要视情况而定.如果它是一个简单、简短的函数,为什么不呢?如果是一个很长的复杂函数,我就不会这么做.(阅读缺点)此外,JIT(Just-in-Time)执行内联,您可以在它执行此优化时进行阅读,它应该有助于您做出正确的决策.

AD.2 如果您正在处理内存有限的环境或代码大小令人担忧的情况,我会避免内联.编译时间太长?此外,也要避免这种优化.

AD.3

  • 小方法
  • 频繁调用(例如,从循环调用的方法)
  • 方法仅从一个位置调用(没有因多个调用点而增加代码大小的风险)

这一切都是关于权衡,你可以接受. 一般来说,内联的优点是:

  • Performance Optimization-在Kotlin中,lambda表达式创建一个新的匿名类,这会产生内存和运行时开销.通过将高阶函数标记为内联,您建议编译器直接在调用点替换该函数的代码,从而避免创建额外的类和函数调用开销.当在循环中或在性能关键型代码中频繁调用这些函数时,尤其有用.
  • Control Over Function Inlining-更多地控制函数应该在何时何地内联,然而,它并不能保证函数总是内联的.

内联也有一些缺点:

  • Code Size Increase-内联函数会导致代码大小增加,因为函数的代码在每个调用点都会被复制.
  • 编译时间增加
  • 复杂性增加-影响代码的可读性和可维护性

Kotlin相关问答推荐

直接从SON解析NonEmptyList

等待下一个值时暂停Kotlin Coroutine

Kotlin异步不并行运行任务

升级使用jOOQ Gradle插件生成代码失败

Scala与Kotlin中的迭代

如何通过更改现有数据类型来执行Android房间数据库迁移?

Kotlin:调用 CoroutineScope.launch 与在协程内启动之间的区别

Kotlin Path.useLines { } - 如何不获取 IOException("Stream closed")?

如何缩短 MaterialTheme.colors.primary?

如何在 jOOQ 中两次加入同一张表?

如何使用 Android CameraX 自动对焦

如何将超过 2 个 api 调用的结果与 Coroutines Flow 结合起来?

kotlin,如何从函数返回类类型

无法在 kotlin android 中以编程方式禁用 EditText

如何将vararg转换为list?

在Kotlin中传递并使用函数作为构造函数参数

查找是否在列表中找到具有特定属性值的元素

旋转 kotlin 数组

在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件

RxJava - 每秒发出一个 observable