上一章学了下高阶函数,我们可以用Lambda表达式很好的使用高阶函数,现在来看看高阶函数的原理,要知道Kotlin文件最终都是被编译成Java字节码的,但是Java中并没有高阶函数这个概念,其实Kotlin的编译器会将这些高阶函数的语法转换成Java支持的那种,比如上次我们写的计算两个数的和和差的函数:

fun main() {

val result = calculate(1, 2) { num1, num2 -> num1 - num2 }

}

fun calculate(num1: Int, num2: Int, function: (Int, Int) -> Int): Int {

return function(num1, num2)

}

它最后大致会被转换成下面的Java代码:

public static void main(){

int result = calculate(1,2,new Function(){

@Override

public Integer invoke(Integer param1,Integer param2){

return param1 + param2;

}

});

}

public static int calculate(int num1,int num2,Function function){

int result = (int) function.invoke(num1,num2);

return result;

}

这些并不是准确的代码,算是伪代码吧,能看懂就行,可以看到Lambda表达式最终实现是一个匿名内部类,既然是匿名内部类,那么久会造成额外的内存和性能开销。

为了解决这个问题,Kotlin提供了内联函数的功能,它可以将使用Lambda表达式带来的运行时开销完全消除,使用时只需要加上inline关键字声明就可以了,比如:

inline fun calculate(num1: Int, num2: Int, function: (Int, Int) -> Int): Int {

return function(num1, num2)

}

内联函数的作用就是:内联函数在编译时会自动的将函数体里面的代码自动的替换到其他位置去,比如,上面的Java代码中的result = (int) function.invoke(num1,num2);在编译时会直接被替换成result = num1+num2,接下来再把内联函数中的代码全部替换到函数调用的位置,那么mani函数就会变成:

public static void main(){

int result = num1 + num2;

}

就是这样,内联函数可以消除Lambda表达式锁带来的Runtime开销。

标签:num1,num2,Int,Kotlin,int,result,内联,函数

来源: https://blog.csdn.net/a644388262/article/details/110095658

java调用kotlin的内联函数_Kotlin内联函数相关推荐

  1. Java 调用 Kotlin

    Kotlin 和 Java 的互操作性是 Kotlin 的一大优点,Kotlin 调用 Java 已经基本不需要特别去注意什么了,但是 Java 调用 Kotlin 代码就不那么好看了.项目切换到 K ...

  2. Kotlin学习笔记 第四章 Java调用Kotlin

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  3. 【深入kotlin】 - 与Java互操作:java调用kotlin

    Java 调用 kotlin 属性 Kotlin 类的一个属性编译后,会产生 3 种 Java 对象: get 方法,getXxx set 方法,setXxx 私有字段,字段名与 kotlin 属性名 ...

  4. kotlin内联函数_Kotlin内联函数,参数化

    kotlin内联函数 In this tutorial, we'll be looking into Kotlin inline function. We'll follow that with Re ...

  5. 【Kotlin 初学者】Java和Kotlin互操作

    作者简介:CSDN博客专家.华为云·云享专家认证 系列专栏:Kotlin 初学者 五星好评:左侧点一下(网页端),移动端:https://bbs.csdn.net/topics/603956616 目 ...

  6. Java:Java vs Kotlin–Android应用程序开发的最佳语言?

    在移动应用技术领域,Java和Kotlin是最流行的搜索词之一.如果你也在寻找Java与Kotlin框架的比较,那么这篇文章就是为你准备的! 让我们来全面了解一下这两种技术之间的区别. 编程语言的定义 ...

  7. 去做海外,无数深坑-第一次使用java调用javascript,第一次调用curl

    工作很多年了,发现互联网有着很多以前从来没听过的名词,真是尴尬啊. 前端时间,产品经理提出 [埋点],当时我就有点懵圈,这是啥玩意.后来请求了android的姑娘,大致意思就是我们的操作上报第三方,由 ...

  8. Kotlin学习路(七):高阶函数与内联函数关系

    <本文学习郭神<第三行代码>总结> 定义用法 高阶函数:如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数称为高阶函数. 语法规则:(String, ...

  9. Kotlin系列四:标准函数、扩展函数、高阶函数、内联函数

    目录 一 标准函数 1.1 作用域函数 1.1.1 let 1.1.2  with 1.1.3 run 1.1.4 apply 1.1.5 also 1.1.6 takeIf 与 takeUnless ...

最新文章

  1. 又拍云SSL证书全新上线,提供一站式HTTPS安全解决方案
  2. 判断一个文件被修改(转)
  3. python3入门-终于懂得python3快速入门教程
  4. 为docker设置国内镜像【转】
  5. Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)
  6. Gradle学习之构建java与web项目
  7. 【语义分割】评价指标代码函数:np.sum()、np.nansum()、np.nanmean()、np.diag()、np.bincount()
  8. codeforces 112APetya and Strings(字符串水题)
  9. iOS-文件断点续传
  10. EXCEL图表之瀑布图
  11. 音乐推荐系统(协同过滤和SVD)
  12. 基于CATIA V5实现无图纸制造
  13. 三维点云预处理之点云去噪
  14. 《工科泛函分析基础》预习笔记 证明:可测集上的连续函数都是可测函数
  15. 多个APP合并为一个APP开发的实现方案
  16. 【 拼多多发表声明:会认真整改 打假决心没有变】
  17. Ubuntu快速下载电驴ed2k文件
  18. 数据结构:单链表中在P结点前插入S结点
  19. 三极管与场效应管的区别与联系
  20. 到底微信公众号和头条号哪个更适合自媒体新人

热门文章

  1. Java调用高德地图API根据详细地址获取经纬度
  2. 股票Q1业绩是什么意思?
  3. 弹出DVD驱动器错误解决方法
  4. 数组里面对象去重的4种方法
  5. Java基础篇:什么是值传递
  6. Spring security 登陆跳转到favicon.ico
  7. [Python]网络爬虫(三):使用cookiejar管理cookie 以及 模拟登录知乎
  8. laytpl语法_laytpl--前端数据绑定
  9. linux 关闭redis 命令_linux关闭redis命令 redis配置redis的服务器启动和关闭 - Redis - 服务器之家...
  10. Redis数据库下载安装