当前位置:首页 » 编程语言 » kotlintojava

kotlintojava

发布时间: 2023-03-22 23:27:35

⑴ 为什么 Kotlin 调用 java 时可以使用 Lambda

1. Kotlin 中的 Lambda 表达式

如果你已经开始使用 Koltin, 或者对它有过一些了解的话,那么一定对这种写法并不陌生了:

// 代码一:Kotlin 代码view.setOnClickListener{
println("click")
}1234

它跟下面这段 Java 代码是等价的:

// 代码二:java 代码view.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
System.out.println("click");
}
});1234567

和 Java8 一样,Kotlin 是支持 Lambda 表达式的,如代码一所示,就是 Lambda 的一个具体应用。

可见,使用 lambda 减少了很多冗余,使代码写起来更简洁优雅,读起来也更顺畅自然了。

但是,你有没有想过,为什么 Kotlin 可以这样写,这里为什么可以使用 lambda ?

2. 为什么可以这么写?

在 Kotlin 中,一个 Lambda 就是一个匿名函数。

代码一其实是对下面代码三的简写:

// 代码三:Kotlin 代码view.setOnClickListener({
v -> println("click")
})1234

之所以简写成代码一的样子,是基于这两点特性:

  • 如果 lambda 是一个函数的唯一参数,那么调用这个函数时可以省略圆括号

  • 如果 lambda 所表示的匿名函数只有一个参数,那么可以省略它的声明以及->符号(默认会用it来给省略的参数名命名)

  • OK,从代码三的结构中,能够更清晰的看出,这里的 view.setOnClickListener 函数是接收了一个 lambda 作为参数。而在 Kotlin 中,什么样的函数才能把lambda(也即另一个函数)作为参数呢?
    —— 对,就是高阶函数。

    什么是高阶函数?

    高阶函数是将函数用作参数或返回值的函数。

    这是 Kotlin 和 Java 的区别之一,java 中并没有高阶函数的支持(java8是有高阶函数的)。当我们在 java 中需要用到类似的概念时,通常的做法是传递一个匿名类作为参数,然后实现其中的某些抽象方法 —— 就比如上面的代码二。

    事实上,如果在 Android Studio 中,从 Kotlin 的代码查看 view.setOnClickListener 函数的定义,就会发现,看到的函数签名就是一个高阶函数的定义:


    o(╯□╰)o

    这种情况比较吊轨,但是还有有可能会出现的。这时候,如果在 Kotlin 中直接使用代码一类似的方式,就会报错了:

  • // 代码六:kotlin中调用,这段代码是编译不过的TestSAM().setSam {

  • println("dodo")

  • }1234

  • 会提示这里歧义,编译器不知道这个 Lambda 代表是 SamType1 跟 SamType2 中的哪一个接口。

    解决的办法就是手动标明 Lambda 需要代替的接口类型,有两种方式可以来标明:

  • // 代码七: 歧义消除// 方式一TestSAM().setSam (SamType1 { println("dodo") })

  • // 方式二TestSAM().setSam ({ println("dodo") } as SamType1)12345

  • 当然,也还有一种方法是不再使用 SAM 转换的机制,而是直接使用一个 SamType1 的实例作为参数:

  • // 代码八: 使用一个实现接口的匿名类作为参数TestSAM().setSam(object : TestSAM.SamType1 { override fun doSomething(value: Int) {

  • println("dodo")

  • }

  • })123456

  • 这种方法当然也是可以的,只是跟 lambda 相比起来,就显得不那么优雅了(优雅很重要!!!)。

    5. SAM 转换的限制

    SAM 转换的限制主要有两点 :

    5.1 只支持 java

    即只适用与 Kotlin 中对 java 的调用,而不支持对 Kotlin 的调用

    官方的解释是 Kotlin 本身已经有了函数类型和高阶函数等支持,所以不需要了再去转换了。

    如果你想使用类似的需要用 lambda 做参数的操作,应该自己去定义需要指定函数类型的高阶函数。

    5.2 只支持接口,不支持抽象类。

    这个官方没有多做解释。

    我想大概是为了避免混乱吧,毕竟如果支持抽象类的话,需要做强转的地方就太多了。而且抽象类本身是允许有很多逻辑代码在内部的,直接简写成一个 Lambda 的话,如果出了问题去定位错误的难度也加大了很多。

    6. 总结

    OK,讲完了。
    总结起来就是SAM 转换就是 kotlin 在调用 java 代码时能使用 Lambda 的原因。了解了其原理,能够让我们在写代码更自如,在偶尔出问题的时候也能更好更快地解决。

⑵ kotlin能取代java吗的最新相关信息

我会建议使用纯JAVA。而不要去考虑Kotlin。否则,你将失去两大优势。
首先要搞清楚,kotlin与JAVA之间,其实并没有任何关系。kotlin是那个做IDE的Jetbrains公司创造的语言,它只和intellij IDEA这个IDE有关系。只是这个IDE,会在编译的时候,把kotlin转换成JAVA代码。所以kotlin无形中,便把使用者与这个IDE捆绑在了一起。而并不是与JAVA捆绑在了一起。

失去的第一个优势,便是从此无法自由选择IDE。。。对于kotlin来讲,将永远只有一个IDE可以选择。用户会成为Jetbrains公司的奴隶。如果有一天,你必须离开这个IDE,那你将会沦为废物,因为如果没有IDEA,kotlin无法做到任何事,哪怕仅仅一个“hello world”都不能。
失去的第二个优势则更加致命,也是JAVA可以获得成功的原因之一。。。JAVA能做的事情,其实很多其他语言也能做到。。但为什么JAVA可以如此受欢迎?除了JAVA本身的强大之外,还有一个原因在于,JAVA与C#语言,几乎是一模一样的。只有非常细微的差别,不仅语法一样,而且连编程思想都一样。只要掌握其中一门,完全可以在几天之内,无师自通另外一门。然后就可以对照api文档,去开发另外一门语言的程序了。所以学习JAVA的一大亮点就在于“学一门,会两门”。
C#很了不起吗?没错,非常了不起。。它本就可以视作JAVA获得成功的最大幕后英雄。。但我不是来讲故事的,因此微软与sun公司的恩怨情仇不在此深究。
我只说三个关键点,你自然明白其中利害关系。
1,它是微软的官方编程语言,微软的亲儿子,天生的富二代,Visual Studio便是为它量身设计。并且是微软唯一可以跨平台的儿子。。微软前不久又为它专门设计了轻量开发工具VS code。。不远的未来,它将成为微软的独子。未来几年,微软几乎全部工作都将与它有关。
2,它是游戏开发行业的第一大编程语言。占有60%以上的份额。Unity3D,CE5,寒霜,夜光,这四大游戏引擎的标准语言。《口袋妖怪Go》《使命召唤》《FIFA》《极品飞车》《最终幻想14》等数以万计的游戏都是由它开发而成。还包括国内最火的手游《王者荣耀》
3,它是虚拟现实(VR)设备开发的第一大语言。
扔掉JAVA,改用kotlin,也就等于与C#分道扬镳。。。所付出的代价,在我看来是无与伦比的。

⑶ kotlin和java区别

Kotlin是JetBrains开发的基于JVM的语言;而Java是一种可以编写跨平台应用软件、完全面向对象的程序设计语言。Kotlin是对Java的一种改进,语法差异:

  1. Kotlin中的方法和属性可以不包含在类中;Java中的一切是以class为基础的,都要在class中,带旁码但Kotlin不是;蠢哪

  2. Kotlin中语句不需要以;结束,Java以;结束;

  3. Kotlin中数据类型是后置的;

  4. Kotlin方启蠢法使用fun关键字定义;

  5. Kotlin的类和方法默认是public final的;

  6. Kotlin中类继承和接口实现使用:标记;

  7. Kotlin中使用var,val声明变量及属性,可以进行类型推断,编译器可以根据赋值自动推断其类型为String,而Java声明变量必须先指定其类型;

  8. Kotlin存在非空与可空类型

  9. Kotlin中package可以与文件路径不一致;

⑷ kotlin和java区别是什么

kotlin能够用更短的代码实现更多蠢氏的功能,这是java无法比拟的。kotlin特有的扩展属性,不再需要java工具类,对开发更加友好。

java中的bean类总是需要使用插件生成settergetter方法。

开放源码

TheIntelliJKotlin插件扩展了Java编译器使得Kotlin代码能够得以编写、编译和调试。除此之外,关于基本的Java集合,已经有编写好的帮助函数,可以更顺畅地衔接将在Java8中出现的集合扩展。有两篇文章对Kotlin与Java以及Kotlin与Scala分别进行了比较,对各自特性和异同进行了对比。

其基础编译器可以被独立出来并嵌入到Maven、Ant或Gradle工具链中。这使得在IDE中开发的代码能够利用已有的机制来构建,从而尽可能地减少了在新环境中使谈腊用所受的干预,哪怕与那些没有安装Kotlin插件的开发人员一起合作项目也没有问题。

即便Scala可能还是更为强大些,Kotlin还是尝试着提供比Java更好的函数、模带侍散式匹配、空指针预防和泛型。

⑸ 如何将kotlin文件转化为java

新建丛判一个没仿Android项目。
修枯郑纤改Gradle代码来添加Kotlin Gradle插件与标准库。
在IntelliJ或Android Studio中添加Kotlin插件。
将Kotlin类文件转换成java。

⑹ Kotlin会替代java吗

下面来讲一下Kotlin和Java相比的优势是什么?
更简洁:这是它重毕培要的优点之一,可以比Java编写少得多的代码。
更安全:Kotlin是空安全的,它在编译期间就会处理各种为null的情况,无需像java一样添加很多的判空代码,节约很多调试空
指针异常的时间,很大程度上避免出现NullPointException。
易扩展:扩展函数意味着我们不仅可以扩展我们原有写好的类,还可以扩展系统级的类,非常灵活,另外如果在类里编写扩展函数,那么只对当前类生效。
函数式:Kotlin使用了很多函数式编程的概念,比如用到了lambda表达式来更方便地解决问题。
Kotlin Android Extensions:再也不用编写物燃烦人的findViewById()了,如果你集成了ButterKnife,是时候删除对它的依赖了,
Kotlin支持了对于View以id形式访问
不用写分号,就像你看到的上述代码一样,对于很多写过脚本语言的童鞋来说,不要写分号这一点真是节省了很多时间,对于一
天写几百行几千行甚至上万行代码的童鞋们来说,相当于省了多少个分号.
到这里有的同学想要说了,你说的这些好处确实不错,但是我之前的项目全是用java语言来写的,难不成让我推倒重来过?别急
,最后我要说的一个最大的优势就是
与Java语言可混合编程,也就是说我们可以继续使用原来所有用Java写的代码和库,因为两个语言之间高度互操作,想尝试的童
鞋们建议可手蚂唯以从新的小功能小模块入手,对这些模块使用Kotlin代码进行编写,原有的稳定模块之后再逐步重构。
对初学者友好,kotlin对java语言转用kotlin提供了很多便利,对于初学者来说免去很多不必要的烦恼。最贴心的是Kotlin插件
支持一键由Java转Kotlin,为你之后想要重构提供了很大的便利性。希望能帮到你,优“”就“”业“”野“”鸡“”希望你能明白

⑺ kotlin能和java混用吗

可以的,Kotlin与Java是兼容的。

热点内容
红木卧室有哪些配置 发布:2024-04-27 17:09:47 浏览:855
中心机编程 发布:2024-04-27 17:00:11 浏览:116
lms滤波算法 发布:2024-04-27 16:55:37 浏览:444
苹果电脑远程桌面连接服务器 发布:2024-04-27 16:53:08 浏览:234
为什么安卓手机没有回响 发布:2024-04-27 16:53:08 浏览:375
搭建邮箱中继服务器 发布:2024-04-27 16:40:42 浏览:198
我的世界的神奇宝可梦服务器 发布:2024-04-27 16:28:28 浏览:589
君威高配有哪些配置 发布:2024-04-27 16:27:54 浏览:199
安卓九彩蛋如何换颜色 发布:2024-04-27 16:10:36 浏览:505
安卓711如何打开隐藏彩蛋 发布:2024-04-27 16:04:53 浏览:814