kotlin应用,为什么 Kotlin 调用 java 时可以使用 Lambda
kotlin应用,为什么 Kotlin 调用 java 时可以使用 Lambda详细介绍
本文目录一览: kotlin使用时遇到的问题(一)
一.当创建android项目时,默认是java形式的activity,如果想要使用kotlin,就要将某个activity转换为kotlin形式的。
使当前窗口显示的界面是要转换的界面,点击code-->convert Java File to Kotlin File
转换完毕后界面就变成了kotlin形式
二.查看build.gradle中并没有出现kotlin的配置,这时可以运行下项目,然后就会在activity的右上角出现configure,点击configure就可以配置kotlin应用范围和版本了。
选择配置
点击ok 等待自动配置kotlin,配置完毕后根build.gradle下后出现
module下的build.gradle会出现
三.运行时报错 unresolved reference kotlinx
这是因为没有添加kotlin的相关插件
在app的build.gradle下添加
apply plugin: 'kotlin-android-extensions'
四.因为使用kotlin之后,不需要再写findViewById(),需要用到
而这个包是在kotlin的extensions插件下。
为什么 Kotlin 调用 java 时可以使用 Lambda
1. Kotlin 中的 Lambda 表达式
如果你已经开始使用 Koltin, 或者对它有过一些了解的话,那么一定对这种写法并不陌生了:
// 代码一:Kotlin 代码view.setOnClickListener{println("click")}1234
它跟下面这段 Java 代码是等价的:
// 代码二:java 代码view.setOnClickListener(new View.OnClickListener() { @Overridepublic 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 函数的定义,就会发现,看到的函数签名就是一个高阶函数的定义:
函数签名提示
如上图,所看到函数签名是:
public final fun setOnClickListener(l: ((v:View!)->Unit)!): Unit
当然,因为方法是在 Java 中定义的,所以它也列出了 Java 的声明,是这样:
public void setOnClickListener(OnClickListener l)
我们知道,Kotlin 跟 Java 的很多类型都有差异,所以它们在互相调用的时,会有一个按照对应关系的转换。
对于上面的对 setOnClickListener 方法的转换,别的地方都好理解,比较难懂的是,为什么会把参数从 OnClickListener 类型转换成了 (View) -> Unit。
(View) -> Unit 是一个函数类型,它表示这样一个函数:接收1个View类型的参数,返回Unit。
正是这个对参数类型的转换,使得 setOnClickListener 方法在 Kotlin 中变成了一个高阶函数,这样正是它之所以能够使用 lambda 作为参数的原因。
而这种转换,就是我们题目中所说到这篇文章的主角 —— SAM 转换 (Single Abstract Method Conversions)。
3. 什么是 SAM 转换?
好吧,说了这么多,终于到正题了。
SAM 转换,即 Single Abstract Method Conversions,就是对于只有单个非默认抽象方法接口的转换 —— 对于符合这个条件的接口(称之为 SAM Type ),在 Kotlin 中可以直接用 Lambda 来表示 —— 当然前提是 Lambda 的所表示函数类型能够跟接口的中方法相匹配。
而 OnClickListener 在 java 中的定义是这样的:
// 代码四:OnClickListener 接口在 java 中的定义public interface OnClickListener { void onClick(View v);}1234—— 恰好它就是一个符合条件的 SAM Type,onClick 函数的类型即是 (View) -> Unit。所以,在 Kotlin 中,能够用 lambda 表达式 { println("click")} 来代替 OnClickListener 作为 setOnClickListener 函数的参数。
4. SAM 转换的歧义消除
SAM 转换的存在,使得我们在 Kotlin 中调用 java 的时候能够更得心应手了,它在大部分的时间都能工作的很好。
当然,也偶尔会有例外,比如,考虑下面的这段代码:
// 代码五public class TestSAM { SamType1 sam1,; SamType2 sam2,; public void setSam(SamType1 sam1) { this.sam1 = sam1; } public void setSam(SamType2 sam2) { this.sam2 = sam2; } public interface SamType1 { void doSomething(int value); } public interface SamType2 { void doSomething2(int value); }}123456789101112138008—— TestSAM 有两个重载的 setSam 方法,—— 并且它们的参数( SamType1、SamType2 )都是 SAM Type 的接口。—— 并且 SamType1 跟 SamType2 的唯一抽象方法的函数类型都是 (Int) -> Unit 。
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 的原因。了解了其原理,能够让我们在写代码更自如,在偶尔出问题的时候也能更好更快地解决。
安卓手机游戏是用什么编程语言开发的?
一、安卓系统开发语言-C/C++
android系统是基于Linux内核开发的,所以底层还是Linux内核与驱动。上层是C/C++本地库和Android运行时环境,这一层主要是android虚拟机和支持虚拟机运行的本地库,采用C/C++语言开发。
二、安卓软件编程语言-Java
为了方便开发谷歌采用了Java语言来开发安卓应用,应用程序框架层API是采用Java语言编写的,方便开发者调用。上层是应用层,就是平时开发者自己开发的应用。这一层谷歌官方支持的编程语言是Java和Kotlin。
三、手机软件编程语言-Kotlin
安卓手机应用早期使用Java开发的比较多,现在多了很多用Kotlin开发的,Kotlin是Google和Oracle发打完官司以后,自己推出来的。代码里可以同时使用Java和Kotlin,目前看来Kotlin已经能满足正常开发需求,并能稳定运行,之所以很多公司还没有完全切换,主要还是历史遗留的java代码,已经能稳定运行的,没有必要再花时间和人工去重构。
2d的一般用cocos,语言是c++,3d一般用的是u3d,语言是js或者c#,上面那俩都是跨平台的,要是lz足够牛x的话直接上opengles
开发iOS应用,Kotlin Native是否够格?
很高兴回答你的问题。
一直以来,ios的开发语言都相对比较单一,要么是swift,要么就是object-c,这样的情况对于ios开发人员来说,还是比较友好的,没有那么多的语言要学习,专心研究一门语言就可以了,可是在KotlinConf 大会宣布了 Kotlin 1.2 RC 版,并宣布 Kotlin/Native 已支持用于开发 iOS 应用和 Web 应用开发。这也将是 Kotlin/Native 0.4 的特性之一。虽然对 iOS 开发的支持仍处于早期阶段,但确实已经实现了,这是在所有平台上使用 Kotlin 进行开发的重要一步。官方还特意展示了利用 Kotlin/Native 开发的两款应用,它们都可以运行于 iOS 和 Android 平台。Android 和 iOS 平台共享了不少代码,其中包括大多数图形处理、声音播放和用户输入响应代码。而且IDEA也已经支持Kotlin/Native了,对于Kotlin/Native是否能够胜任ios的开发,我觉得应该从以下几点来看。
1、性能
现在移动端的开发,很注重的就是用户体验以及产品的性能,Kotlin/Native作为一个新生的语言,在性能这一块,还有待考究。
2、技术成熟性
现在的Kotlin/Native在技术方面感觉尚未成熟,想要撼动swift或者object-c的地位,可能还需要一段时间,就像kotlin,虽然官方已经宣布将kotlin作为Android开发的官方语言,可是,这么久过去了,还是没能取代Java。
3、实际的开发体验
因为我没有用过Kotlin/Native开发ios,但是,在Android平台上面,很多的程序员抛弃Java投奔向kotlin,但是使用了一段时间后,又转过头来使用Java,这便是在实际的开发过程中,很多程序员觉得kotlin并没有想象中的那么好,转而又开始使用Java。
如果以上三点,Kotlin/Native都做的很好了,那么ios的开发市场,应该就会被Kotlin/Native给占据了,各位有什么看法,欢迎评论。
以上便是我对开发iOS应用,Kotlin Native是否够格?问题的回答,如果您觉得有道理,请点赞,关注,支持我,谢谢。
只要符合业务需求它就是够格的,但是要做出优质的app还是得用原生的语言,其他的或多或少都会有性能的损耗,除非该框架已经非常成熟!
kotlin这个报错怎么解决呢?
要解决Kotlin的报错,您可以采取以下步骤:
1. 理解错误信息:仔细阅读报错信息,了解具体的错误类型和位置。这将有助于您确定问题的根本原因。
2. 检查语法错误:检查您的Kotlin代码是否存在语法错误,例如拼写错误、缺少分号等。修复这些常见的错误可能会解决报错问题。
3. 寻找代码逻辑错误:检查您的代码逻辑并确保其正确性。这可能涉及变量使用、条件语句或循环的正确性等方面。通过调试和排除错误,您可以修复代码中的逻辑问题。
4. 检查依赖项:如果您在使用第三方库或框架时遇到问题,可能是由于依赖项版本不兼容或冲突导致的。确保您的依赖项版本正确,并且相互之间兼容。
5. 参考文档和社区支持:Kotlin拥有丰富的文档和活跃的社区支持。查阅官方文档、stackoverflow等在线资源,或者向Kotlin社区提问,以获取更详细的解答和帮助。
6. 更新Kotlin版本:如果您使用的是较旧的Kotlin版本,尝试升级到最新版本。新版本通常包含修复和改进,有可能解决您遇到的问题。
7. 请求帮助:如果您无法解决问题,可以将具体的报错信息和相关代码示例提交给相关的技术支持团队、开发者社区或论坛,并请求帮助。
请注意,报错信息的具体情况和问题的实际原因会对解决方案产生影响,因此尽量提供更具体的报错信息和相关代码示例,以便获得更准确的帮助。
很抱歉,你并没有提供具体的 Kotlin 报错信息。Kotlin 是一种编程语言,它可以在不同的环境和应用中使用,报错信息的具体解决方法取决于报错的类型和上下文。
通常来说,你可以尝试以下步骤来解决 Kotlin 报错:
仔细阅读报错信息:报错信息通常提供了关于问题的详细描述,包括具体的错误原因和位置信息。仔细阅读报错信息有助于理解问题和定位解决方案。
搜索解决方案:将报错信息复制并在搜索引擎中搜索,可能会找到相似问题的解决方案或社区中的讨论。许多开发者都遇到过类似的问题,并分享了他们的解决方法。
检查代码:仔细检查与报错相关的代码,确保语法正确、类型匹配,并排除常见的编码错误。
更新依赖库或框架:如果你正在使用依赖库或框架,可以尝试更新到最新版本,以修复已知的问题或漏洞。
向社区或论坛寻求帮助:如果以上方法无法解决问题,你可以将报错信息以及相关代码和环境信息发布到相关的社区或论坛中,寻求其他开发者的帮助。
安卓开发用什么语言
安卓系统是目前全球使用最广泛的移动操作系统之一,而安卓应用程序的开发则需要使用特定的编程语言。下面将介绍安卓开发最常用的语言。JavaJava是安卓开发中最常用的编程语言,也是安卓官方推荐的语言。Java在安卓开发中的地位类似于C语言在系统编程中的地位。Java语言的优点在于其跨平台性,可以在不同的操作系统和硬件平台上运行。此外,Java还有丰富的类库和API,可以快速开发出高质量的安卓应用程序。KotlinKotlin是一种新兴的编程语言,由JetBrains开发。Kotlin语言的特点在于其简洁、安全、互操作性强、易于学习等。Kotlin语言可以与Java语言无缝集成,因此在安卓开发中也越来越受到开发者的青睐。C++C++语言在安卓开发中也有一定的应用。C++语言的优点在于其高效、灵活、可移植性强等。在一些对性能要求较高的应用程序中,如游戏开发等,C++语言可以发挥出其优势。综上所述,Java和Kotlin是安卓开发中最常用的编程语言,而C++语言则适用于一些对性能要求较高的应用程序。开发者可以根据自己的需求和技能选择合适的编程语言进行开发。
应该使用Kotlin进行Android开发吗
Kotlin的优势
因此,您可能需要考虑切换到设计为在JVM上运行的许多现代编程语言之一。尽管编译为Java字节码的语言不乏,但有一些因素使Kotlin脱颖而出:
与Java的互换性
Kotlin作为Java的潜在替代品的最大优势之一是Java和Kotlin之间的互操作性水平 - 您甚至可以在同一个项目中并行存在Java和Kotlin代码,并且所有内容仍将完美编译。下面,您可以看到由Java Activity和Kotlin Activity组成的项目示例。
事实上,一旦你的混合的Kotlin和Java项目被编译,用户将无法知道您的项目的哪些部分是用Java编写的,哪些部分是用Kotlin编写的。
由于Kotlin和Java类可以并行存在于同一个项目中,所以您可以开始使用Kotlin,而无需像Kotlin一样将整个项目转换为Kotlin,或者专门开始一个新项目,以便您可以在Kotlin尝试您的手。
由于这种互操作性水平,如果您有一个您已经开始工作的项目,您可以在该项目的一小部分中试用Kotlin,而不会影响其余的代码库。而且,如果您确定要继续使用Kotlin,则可以将项目现有的Java代码一次迁移到Kotlin一个文件,也可以将项目的旧Java代码保持原样,并且只能使用Kotlin来实现新的类和功能。
由于Kotlin可以与Java完全互操作,您还可以使用Kotlin项目中的大多数Java库和框架,甚至依赖于注释处理的高级框架。
简单学习曲线
Kotlin旨在加强Java,而不是完全重写,所以您在Java职业生涯中获得和磨练的许多技能仍然适用于您的Kotlin项目。
Kotlin也被设计为Java开发人员有一个温和的学习曲线。 Java开发人员应该发现,Kotlin的大部分语法都很熟悉;例如,用于在Kotlin中创建一个新类的代码与Java非常相似:
1
class
MainActivity : AppCompatActivity() {
Kotlin也被设计为直观易读,所以即使你遇到一些截然不同的代码,你仍然可以得到这个代码的作用。
结合最好的功能和程序编程
目前有一些广泛使用的编程范例,但是当涉及到“哪种方法是最好的”的时候,没有简单的答案。每个编程范例都有自己的优点和缺点,因此尽管功能编程有优势的场景不乏,但程序方法更有效的问题也很多。
那么为什么要在功能和程序之间选择呢?像许多现代编程语言一样,Kotlin旨在通过结合程序和功能编程的概念和元素,为您带来最好的两个世界。
一流的Android Studio支持
Kotlin是由JetBrains开发的,该公司是Android Studio所基于的IntelliJ-IDE的公司。那么,Android Studio对Kotlin有很好的支持并不奇怪。一旦您安装了Kotlin插件,Android Studio就可以在您的项目中配置Kotlin,就像打开几个菜单一样简单。
一旦您为Android Studio设置了Kotlin插件,您的IDE将无需理解,编译和运行Kotlin代码。 Android Studio还为Kotlin提供调试,自动完成,代码导航,单元测试和完全重构支持。
一旦您的Android Studio项目配置为支持Kotlin,您甚至可以将整个Java源文件转换为Kotlin文件,只需点击几下鼠标。
更简洁的代码
如果比较产生相同结果的Java类和Kotlin类,则写入Kotlin的类通常比使用Java编写的一样简洁和紧凑。 而且每个开发者都知道,代码减少意味着更少的错误!
有什么收获?
没有编程语言是完美的,所以虽然Kotlin有很多提供Android开发人员,但您需要注意一些缺点:
额外的运行时大小
Kotlin标准库和运行时将增加您的.apk的大小。虽然这只相当于大约800KB,如果您的应用程序已经在很大的一边,那么额外的800KB可能会提示它在边缘,并让用户在下载你的应用程序之前思考两次。
代码的初始可读性
虽然Kotlin的简洁语法是语言最大的优点之一,但是最初可能会发现一些Kotlin很难解读,因为在这么少的代码中有很多事情要做。 Java可能更冗长,但是上面的一切都是明确的,这意味着不熟悉的Java代码比不熟悉的Kotlin更容易破译。
另外,如果使用不当,Kotlin的操作员重载会导致难以阅读的代码。
缺乏官方支持
Kotlin可能在Android Studio中有很好的支持,但值得一提的是,Kotlin没有得到Google的正式认可。
此外,与纯Java项目相比,当您使用Kotlin时,Android Studio的自动完成和编译往往运行速度稍慢。
更小的社区和更少的可用帮助
由于Kotlin是一种相对较新的语言,所以Kotlin社区仍然相对较小,特别是与围绕更为成熟的Java语言的社区相比。如果您切换到Kotlin,那么您可能无法访问相同数量的教程,博客文章和用户文档,并且可能会在论坛和堆栈溢出等场合遇到较少的社区支持。在撰写本文时,在Stack Overflow上搜索Kotlin只返回标签为Kotlin的4,600个帖子,而包含Java标签的高达1,000,000个帖子。
安卓App开发用什么语言
安卓App用Java和Kotlin作为开发语言。
Google IO 2017宣布了 Kotlin 会成为 Android 官方开发语言。在Kotlin 语言出现之前,几乎所有的安卓应用程序都是使用Java语言编写的。
扩展资料
Google在今年I/O2017开发者大会中宣布,正式把Kotlin纳入Android程序的一级开发语言(First-),并与开发团队JetBrains合组非牟利基金会推广Kotlin。据多间外国媒体报导,这是GoogleI/O开发者大会中引来最多欢呼声的消息。
Kotlin将于.0得到支持,JetBrians指开发者不用再安装额外元件或担心兼容问题。Kotlin能与Java互通,但拥有Java不支持的功能。Google相信利用Kotlin可使Android程序开发更快捷有趣,但他们补充,此举绝非取代Java和C的官方支持。
Kotlin作为Android开发语言相比传统Java有什么优势
语法简洁,在加上都是google一家的
Kotlin由JetBrains公司开发一个基于 JVM 的新的编程语言,它的最大特点之一就是与Java 100%互通,并具备诸多Java尚不支持的新特性。
安卓开发一级语言为Kotlin,并不意味着JAVA彻底倍淘汰,一方面是因为JAVA不仅靠安卓活着,它还有很多其他应用需求,另外,Kotlin语言依然是跑在JVM(Java Virtual Machine )规范上的。
优势
提供一种更好的 Java 而非重建整个新平台。
基于 web 的演示中体验使用该语言,通过你的浏览器来编辑 Kotlin 代码、编译。
Kotlin 还是尝试着提供比 Java 更好的函数、模式匹配、空指针预防和泛型。该语言同时也支持特征(traits)和模式匹配。
如何学习Kotlin编程语言
这语言听说bug很多
csdn有很多kotlin的资料
为什么说 Kotlin 是优秀的
本文不会像一般介绍语言的文章那样,一开头就罗列出语言那些酷炫的特性,我们稍后再来探讨这些内容。
首先我将介绍一些其它的信息,因为2013 年一项研究显示,当开发者评估一种编程语言时生态系统要比语言特性更重要。这符合我个人的经验,下面就让我开始介绍吧:
Kotlin 被编译成 JVM 字节码或者 JavaScript 代码。Java 开发者将会是对它最感兴趣的人,不过对于使用垃圾收集运行时语言的开发者而言它也具有一定的吸引力,比如 Scala、Go、Python、Ruby 和 JavaScript 等语言。
Kotlin 来自业界,而不是学术界。它解决了开发者现今面临的实际问题。例如它的类型系统可以帮助你避免空指针异常。
切换到 Kotlin 无需成本!它是开源的但这不是重点,重点是它提供了一个高质量的一键从 Java 转换到 Kotlin 的工具,并且十分关注 Java 二进制文件的兼容性。你可以将现有 Java 项目的一次性转换成 Kotlin 项目,而该项目仍将可以正常编译,即使这是一个包含上百万行代码的复杂程序。
显然你可以从上文得知,Kotlin 程序能够使用所有现存的 Java 框架和库,甚至那些依赖注解处理的高级框架。它们之间的交互是无缝的,不需要包装或者适配层。Kotlin 可以整合 Maven,Gradle 以及其它构建系统。
它十分平易近人,语法精炼直观,仅仅是阅读语言参考文档几个小时就能学会使用。Kotlin 看起来十分像 Scala 但是更加简洁并且兼顾了可读性。
它不遵循特定的编程哲学,例如极度的函数式编程或者面向对象编程风格。
它不会增加运行时的开销。Kotlin 的标准库十分小巧紧凑:专注于扩展 Java 标准库,编译阶段的大量内联操作意味像 map/filter/reduce 等管道结构函数将被编译成类似于命令式语言的代码。
Anko 与 Kovenant 等框架的出现意味着在 Android 开发者中 Kotlin 开始变得流行起来。如果你正在从事 Android 相关的工作,相信你很快就会获得好的工作。你可以阅读这份 Square 公司开发者 JakeWharton 的报告,了解用 Kotlin 进行 Android 开发的体验。
Kotlin 允许你继续使用你的工作效率提升工具。IntelliJ 的 IDE 对 Kotlin 的支持十分完善:你可以对代码进行重构、搜索、导航以及使用自动完成,而且 IDE 充分支持调试、单元测试、性能分析等等功能。
除了 Android,我认为 Kotlin 还非常适用于企业中 Java 的应用场景。如果你的工作是整天埋头于大公司的代码库中,那么当 Kotlin 1.0 版本正式发布时你应该尽快去了解一下:
由知名公司为它提供强大的商业支持。 JetBrains 这家公司 有一个高度称职的大团队致力于该项目,有稳定的商业模式甚至在自己的部分旗舰产品中使用 Kotlin,这表明短期内 Kotlin 不会被放弃。
使用 Kotlin 风险较低:可以由一两个感兴趣的团队成员在项目中小范围的试验 Kotlin,这并不会扰乱你的项目,因为 Kotlin 的类对外提供的 Java API 看起来就与普通的 Java 代码一样。
因为 Kotlin 十分注重语法的可读性,代码审查不会成为问题,对 Kotlin 不熟悉的团队成员仍然能够完成该工作。
Kotlin 基于 Java 6,所以假如你难以在项目中升级使用新版本的 JVM,你可以使用 Kotlin。
今年早些时候我向 Swiss Re 这家瑞士再保险公司的团队(他们使用 Java 和 .NET)展示了 Kotlin。首先我定义了一个简单的 Java 类包含一些字段以及 toString、equals、hashCode 等方法,大概有 50 行代码。然后我将它转换成 Kotlin 代码(大部分是自动完成的),结果仅剩 1 行代码,接着我还演示了其它节省时间的特性。他们看过后对 Kotlin 充满了热情并且认为 Kotlin 是它们项目中 C# 语言的一个潜在竞争对手。
我认为 Kotlin 正中企业 Java 开发者的红心,所以尽管 Kotlin 是免费的,JetBrains 还是能够通过它增加商业版本 IDE 的销售来赚大钱。这将激励他们根据用户的意愿持续改进它。
与此相比,对于那些由不相关产品资助的语言开发者来说,当用户需求与之前的设计理念冲突时,他们很少会因此作出调整。
特性
Kotlin 作为一门新的编程语言能够脱颖而出,是因为它关注生态系统:JetBrains 懂得生产力的高低更多的取决于生态系统而不是便捷的语法。
尽快如此,Kotlin 还是有许多有用的特性能让你编码的过程变得愉快:
我们已经提过 null 安全(可选),它能够让编译器系统的标记潜在的空指针引用。与一些语言不同的是它不涉及 option 类,因此是零开销的,并且还有其它语言特性确保它不会造成不便。
精炼的语法:无处不在的类型推断、简单的函数只需要一行、简单的结构以及 JavaBeans 也只需要一行就能声明、真正的属性——可以在背后自动生成 getFoo/setFoo 方法用于与 Java 进行交互、函数可以独立存在于类之外。
异常均为非检查型。(译者注:感兴趣的可以阅读一下Java 理论与实践: 关于异常的争论)
使用 data class 关键字创建数据类会自动生成通用方法,例如 equals、hashCode、toString 以及 copy 和 componentN(同时声明多个变量时会调用该方法)。这将帮助你在不使用构建器的情况下便捷的获得不变类(immutable classes)。
但如果你需要构造复杂的结构体,借助类型安全的构建器这个特性可以简洁的实现。如果你使用 Google Protocol Buffers 来存储结构化数据, 通过 KBuilders 这个库也能很轻易做到。
支持函数式编程以及零开销的 lambda 表达式,能够在 Java 的集合中做 Map、Filter、Folder 等处理。Kotlin 的类型系统能够自动识别可变或者不可变的集合。
扩展函数特性能够让你在不改动源码的情况下为类添加方法。乍眼一看以为是为了避免写出像 FooUtils 这种风格工具类的语法糖,不过随着使用的加深,你会认识到它不仅能帮你更加容易的通过自动完成使用方法,还能协助你集成现有的 Java API 以及借助其它 Kotlin 特性构建功能强大的扩展。
支持运算符重载,但是不会像 Scala 或者 Perl 那样出现难以理解的代码。运算符被映射成相应名字的方法,通过重写这些方法改变运算符的行为(包括函数调用),但是不能定义新的运算符。这使得程序能够兼顾功能与可读性。
Kotlin 没有宏或者其它的方式来重定义语言,但是通过这些精心设计的特性能够使第三方库自由的对它进行扩展,官方对集合类进行的扩展也只是小试牛刀而已,请看以下例子。
想使用 fibers、actors 和 Go 风格的 channels?一个名为 Quasar 的库已经为你实现了。
使用 Markdown 替代 HTML 来编写 API 文档,这样编写 JavaDocs 可比以前舒适多了。(译者注:JetBrains 提供了相应的文档生成器 Dokka)
更好用的泛型。如果你没有完全掌握泛型参数中 super 以及 extends 的含义,别担心,这不是你的错。Java 的泛型的确令人费解,Kotlin 解决了这个问题。
委托是一个大家都知道的设计模式,Kotlin 原生支持它。
== 运算符的行为符合预期(译者注:简单来说 a == b 相当于 a.equals(b);新增了 === 运算符,用来判断运算符两边是否指向同一个对象)
想快速便捷的进行异步编程吗?当然!
字符串插值“可以使用这样的写法在字符创中直接引用变量 {this.example}”
函数中的参数可以指定默认值、使用可变长度以及通过参数名传参。
还有许多的调整与优化。假如 Java 中有某些让你觉得困扰的问题,我相信 Kotlin 一定已经把它处理好了。
现在就来试用一下!
跟很多现代编程语言一样,Kotlin 可以通过网页浏览器来进行体验。不过跟其他语言不一样的是,Kotlin 的实验网站提供了一个成熟的 IDE,包括响应很快的自动完成,实时的后台编译,甚至还有在线的静态分析!
在线试用一下吧
好了,让我们继续接下来的内容
目前存在哪些问题?
生活中没有什么是完美的,包括 Kotlin。以下是我尝试这门语言时遇到的一些问题。
最大的问题是不够成熟,因为 Kotlin 目前还处于 Beta 阶段,这意味着:
每更新一个版本,语法、ABI 以及标准库就变一次。好消息是这些变化通常比较微小,可以借助 IntelliJ IDE 来自动升级你的代码,所以这个过程并不会太麻烦。
Java-to-Kotlin 的转换工具(J2K)还没有完成。它偶尔会大规模的破坏和默默地擦除 Java 8 中的 Lambdas(修改:2015 年 10 月:M13 版本的转换工具已经可以正确地处理 Java 8 的特性了)。由它转换而成的代码并不总是最好的写法,但是 JetBrains 为这个工具付出了大量努力,它已经是我用过的语言转换工具中最好的了。所以我并不太担心这个问题,这个转换器正在迅速的改进中,变得越来越成熟。
你会遇到编译器错误。尽管我的程序并不大,但还是会发生无法编译的情况,甚至错误的编译结果。诊断这些问题并不难,但终归还是影响了开发的体验。
你会遇到 IDE 内部错误。当这个错误发生时,IntelliJ IDE 会弹出一个悬浮窗口,附带向 JetBrains 报告的选项。大部分错误无需理会,不过依然会使人厌烦。
偶尔会出现无法加载提示文档的错误(修改:M14 版本发布后,这个问题已被修复)
目前 JetBrains 正致力于完善发布 1.0 版本而不是添加新的功能,期待这些问题能够得到修复。
第二个我遇到的比较大的问题是,有时与 Java 的交互会受到局限。
一个典型的 Bug 是 Java 的类型系统无法防止你改变 Map 中 Key 的类型。按理来说,这样操作应该导致编译器报错,例如使用类型错误的 Key 删除元素。有些 JDK 中的集合使用了泛型,它们某些重要方法的泛型参数是 Obejct,所以编译器不会提示。当在 IntelliJ IDE 中编写 Java 代码时会有静态分析的警告,但是目前 Kotlin 环境还没有这个功能。因为 Kotlin 使用的是 Java 的集合框架没有自己实现,所以这导致了一些类型安全方面的问题,我已经遇到好几次了。
(修改:1.0 Beta 版本中这个问题已经解决了,Java 中集合框架的类型安全缺陷在 Kotlin 已经不复存在。哟呵!)
另一个例子是,当调用或使用 Java 代码时 Kotlin 的 Null 安全特性无法发挥作用(可以借助注解弥补)。作为 Kotlin 的初学者,刚开始你可能会写许多调用 Java 库的代码,但是因为以上的问题它们并没有你想象中那么好用。这种情况的改善只能等待 Kotlin 使用人数的增长。JetBrains 一直在尝试使 Null 安全特性能体现在 Java 交互中,这种想法是好的,但有时考虑并太周全。(修改: 从 M13 版本开始,在 Java 代码中将自动以 @NotNull @Nullable 等注解实现 Kotlin 的 Null 安全特性)
虽然有以上的问题存在,但同时也使得我们能更流畅的使用 Java API,我觉得这种权衡是值得的,只是在开发中要注意。
其它需要考虑的问题:
Kotlin 的社区还比较小。虽然目前没有多少 Kotlin 的库可以使用,但是凭借优秀的 Java 交互能力,Kotlin 可以使用现有成熟的 Java 库。
如果你喜欢看书来学习,那么你需要等到今年晚些时候才能看到 Kotlin 开发者写的书(译者注:Kotlin in Action)
纯粹的函数编程风格开发者可能会觉得类型系统中缺乏一些 Scala 或 Haskell 拥有的高级功能。如果你对类型系统一些功能比较看重,那么 Kotlin 可能不适合你。
Kotlin 还能编译成 Javascript 代码,但是比较少用,所以可能会遇到更多的问题,这是我从论坛中得到的印象。(修改: 目前 Kotlin 的开发重心在于完成 1.0 版本并使其稳定运行在 JVM 中,Javascript 方面的问题将会在 1.0 发布后着手解决)
没有标准的编程风格指南,目前 Kotlin 提供了多种语法可供选择。不同人写出来的 Kotlin 代码很可能完全不一样。这与 Go 严格的风格形成了鲜明的对比。(修改: Kotlin 1.0 版本开始,一些灵活的语法已经被移除了,例如现在重载运算符以及定义中缀函数时必须分别使用 operator 和 infix 关键字进行标记)
Kotlin 的编译速度稍稍慢于 Java,以及 IntelliJ IDE 的智能提示反应有点缓慢,不算严重而且比 Scala 快多了。(修改:Kotlin 1.0 开始编译速度有了明显提升)
Kotlin 有一个 Eclipse 插件,但是很明显没有 IntelliJ 的好用。
Kotlin 在某些方面比 Java 要严格。它不会自动将 Int 转换为 Long 类型,需要开发者显示的转换。这是因为 Kotlin 关注正确性和试图解决《Java Puzzlers》一书中提出的问题。JetBrains 声称他们已经搞定一半了。
Kotlin 基于 Java 6,因此会受到它的局限。Kotlin 与 C# 在很多领域都很相似甚至比 C# 做得更好,但是它缺少一些功能,例如 Java 平台尚未支持的某些数据类型。
为什么应该开始考虑使用 JVM
最近一段时间我遇到了很多使用动态脚本语言(JavaScript 或者 Go —— 译者注:Go 应该是静态编译型语言)的创业公司。
我在 Bitcoin Space 工作的时候,使用动态语言是非常痛苦的事情。在这些语言里没有安全性的类型,这已经导致了巨大的货币损失。Go 比较少出错,但是在基础层面上给人的体验依然很差,比如说缺少好的调试工具,快速 GC 机制,稳健的管理器以及可靠的分析工具。
过去 15 年或者更长时间里,Java 变得越来越健壮,越来越冗长,甚至有过度设计的迹象,这些变化很大程度上源于它的声誉。企业级 Java 类的名字 PathVariableMapMethodArgumentResolver 就是例证。在很长一段时间里我没有考虑 JVM,我确信这种环境并不适合我。
最终我因为 Android 被迫回到 Java,发现 Java 的开发环境已经改变了。虽然 XML 仍然不合时宜的频繁出现在各种场合,但是一些基础功能十分完善,令人印象深刻。 IntelliJ 是比 Eclipse 更快并且更智能的 IDE。Maven 一出现就得到了迅速的发展,拥有许多原本我想要其它构建 / 依赖系统增加的功能。较新的 Web 框架像 Ninja 和 Play 从类似 Ruby on Rails 的框架中学到了轻量简洁。有大量的库可供使用。硬件性能变得更高以及 JVM 变得更有效率,等等转变。
没有真正改变的是语言本身,Java 代码写起来依然是令人不快的冗长。
现在有了 Kotlin,完全无需承受离开 Java 现有的生态系统的疼苦。你可以编写更富有表现力的代码,但是却比脚本语言更简洁,同时拥有更好的性能和更少的错误。
如果你喜欢 JavaScript,可以尝试 Kotlin 的 JS 后端,或者在 Nashorn JS 引擎里运行你现有的代码。
最后,如果你喜欢 Go 语言是因为它可以编译独立运行的程序,那么试试 javapackager 工具。Kotlin 在本地为每个平台创建了捆绑包,这意味着在 linux 上不需要 JRE 的依赖就可以独立自主的获取 DEBs(linux 的安装包)或者压缩包。当然,它拆包之后不是单个文件而是单个目录,从部署的角度来看并不难操作。
简而言之:如果你之前因为看 Java 不顺眼而忽略了 JVM 的生态系统,那么你应该借着 Kotlin 这门新语言进入这个世界瞧瞧。