Kotlin与java相比,有哪些明显特性,能否举个例子说明下呢?
1条回答 默认 最新
关注 Kotlin具备现代(也有称下一代的)静态编程语言的很多特点,如:
类型推断、多范式(OOP,FP)支持、可空性表达、扩展函数、DSL 支持等。
另外对于安卓开发还提供了 Kotlin 安卓扩展和 诸多库,如Anko 等。还有,KotlinJS,KotlinNative。
特性:
开发效率和简洁性
空安全(类型系统编译时检查null)
扩展函数/属性(Extension Functions/Properties)、委托(Delegate)
DSL 支持
集合类中丰富的函数式API、泛型等
多范式编程支持(一等OOP: 接口抽象类继承多态等等,一等FP: 高阶函数和Lambda表达式 )
协程(Coroutines)- 1. 比Java简洁。
Java的好处是语法工整,清晰直接,严格;但是它的问题也很明显:“verbosity”,中文通俗翻译就是 “罗里吧嗦,烦死了”。经常是 Python 或者 Ruby 10行完成的逻辑或者data class,用 Java 可以轻松轻松写出三倍多的代码。大部分Java程序员对此表示很无语,小数程序员可能还会陷入一种自我催眠状态,觉得自己程序码的多,于是码的爽,于是沾沾自喜于每天可以写500或者上千行代码的自我感动中。
而 Kotlin 和 iOS 上的 swift 的出现,可以有效地节约我们程序员不少的时间,让写代码更为有效率。Kotlin 不仅仅是“A Better Java ”)。
兼容Java强大的生态的同时给Java注入年轻、灵活、高糖的语法;Kotlin的出现填掉了Java开发经常遇到的坑,而且兼容性很好,难度适中还适合Java开发人员切换。
- 2. 空安全(Null Safety)。Kotlin 的显式optional加链式调用:
val name = article?.comments?.get (0)?.author: "none'
相比一长串 if-else 是简洁了许多。
Kotlin的一大亮点就是语法层面强制Nullable,这点从实际工程角度来说还是非常有利的。虽然Scala可以用Option。Kotlin这个地方设计很高糖,写起来很舒服,并没有Scala的Option、Java的Optional的不适感。所以Kotlin从语法层面和便捷层面设计的Nullable还是要给一个大大的赞的。
另外 Java 还有最大的一个问题,在Null的处理上一直是其阿基里斯之踵(https://www.apteligent.com/technical-resource/top-5-crashes-on-android/)。 不仅仅在Android的Crash中,而且在服务端开发中NPE也普遍存在,就跟当年的C/C++的指针、内存泄漏一样让人们头疼。
在 Android top crashes 的排名上:第一 NPE(NullPointerException),第二 OOM(OutOfMemoryException,特别对于低端手机而言);Java 最近的改进也是在 annotation 上增加对于 null 的规范和检查。而 Kotlin 则是彻底规范了对于变量在 null 上检查和支持 "?:" 来简洁地处理 null。比如:
if (nullable != null) nullable.doSomething() // Java nullable?.doSomething() // Kotlin
- 比Groovy安全、更具工程实践性
- 比Scala简单、更具工程实践性。
Kotlin是一个经过精挑细选,筛掉了部分功能的Scala。也可以说是一个填了无数大坑,经过精心强化版的Java。从设计角度来说,Scala虽然顶着多范式编程的大旗,但是无疑她就是一门非常偏FP的语言,如果是把她当成换了语法的Java来写,那肯定会写出风格诡异,可读性很差的代码来。而Scala还有Kotlin不具备的强大的类型系统、强大的模式匹配、任意方法名来代替有限的运算符重载等功能,以及还有一个迭代多年、精心设计过的强大类库;这些都是Scala比Kotlin功能更加强大的证明。
当然Scala的强大直接带来的一点就是复杂度爆炸,学习曲线陡峭,如果没有经过长期的实践和理论学习,恐怕Scala肯定会写成一个“换了语法的Java出来”,而且这样写你绝对不会觉得比Java好用。另外Scala非常致命的一个缺陷就是兼容性实在不敢恭维,一个寿命有十多年的语言,而且还是运行在JVM上的语言居然到现在都有大版本升级二进制互相不兼容的问题,使用第三方库还要考虑下对方是什么版本的?支不支持我的版本?这个版本在目前这个项目能不能用?拿源码升级的话我能不能跨版本编译过去等蛋疼的问题。而这个兼容性从另一个角度看,个人认为Scala编译器编译出来的字节码完全就只是为了能运行在JVM上,然后顺便考虑了下与Java的交互。
PS: 就不要再用Kotlin和Scala交互了。
Kotlin没有Scala那么“高冷”,难度上是可以适合绝大多数开发人员的,加上和Java的兼容性很好,又被Google钦点,未来Kotlin必将与兄弟Java共同作为JVM上的主流语言,而且是成长潜力巨大的语言。
与Groovy、Scala或Clojure等“同门师兄弟”相比较而言,Kotlin是有诸多外部条件(JetBrains,IDEA,Android Studio,Spring 5, Gradle ,Google Android 等)优势跟语言内在优秀特性(如上所述等)的。
- 5. 与Java 100% 互操作。
Kotlin添加了大量函数式风格,它的map、filter等等操作比Java 8 Stream的来得简洁直接。另外,涉及到集合类、反射、多线程、IO等操作时,**Kotlin**则直接使用了**Java**的特性,并在**Java**的基础上做了易用的扩展。这点跟**Groovy**一脉相承。
当然,事物都是具备两面性的。Kotlin也有缺点。
虽然,官方说100%与 Java 互操作,但是在 Java 调用 Kotlin 的时候还是存在一些不方便的地方,有少部分地方显得“不够简洁、优雅”。
但是,瑕不掩瑜。PS: Java 程序员快速了解Kotlin的一个基本特性的对比示例:https://fabiomsr.github.io/from-java-to-kotlin/
Kotlin是JetBrains团队开发的一门现代的、注重工程实用性的静态类型编程语言,JetBrains团队以开发了世界上最好用的IDE而著称。Kotlin于2010年推出,并在2011年开源。Kotlin充分借鉴汲取了 Java、Scala、Groovy、C#、Gosu、JavaScript、Swift等多门杰出语言的优秀特性,语法简单优雅、表现力丰富、抽象扩展方便、代码可重用性好,同时也支持面向对象和函数式编程的多范式编程。Kotlin可以编译成Java字节码运行在JVM平台和Android平台,也可以编译成JavaScript运行在浏览器环境,而且还可以直接编译成机器码的系统级程序,直接运行在嵌入式、iOS、MacOS/Linux/Windows等没有JVM环境的平台。Kotlin源自产业界,它解决了工程实践中程序设计所面临的真实痛点,例如,类型系统可以避免空指针异常的问题。 我最早是被Kotlin的下面这段代码所吸引:
package com.easy.kotlin
fun compose(f: (B) -> C, g: (A) -> B): (A) -> C {
return { x -> f(g(x)) }
}fun isOdd(x: Int) = x % 2 != 0
fun length(s: String) = s.length
fun main(args: Array) {
val oddLength = compose(::isOdd, ::length)
val strings = listOf("a", "ab", "abc")
println(strings.filter(oddLength))
}
13行。 这大约是在三年前,当时我在学习 Java 8 中的函数式编程以及 Lambda 表达式等新特性。那时,我也对Scala、Groovy、Clojure、Haskell等技术很感兴趣,简单学习了部分知识。在这样伴随着兴趣的学习过程中,我无意中看到了上面那段Kotlin代码,第一眼看到这么优雅的函数式编程风格,尤其是compose函数的定义实现,我被深深地吸引了。 Swift 使用func关键字声明函数多个 c 怪怪的,Groovy、Scala 等使用 def 跟函数本义联想不直接 ,JavaScript 中使用 function 关键字又显得死板了些。而 Kotlin 中的 fun 则简单优雅地恰到好处,关键还让人自然联想到“乐趣、开心的、使人愉快的”这样的意思。使用 Kotlin每写一个函数都是充满乐趣的。我们不妨来看看同样的逻辑实现,如果我们使用 Java 8来写,代码如下所示
package com.easy.kotlin;
import java.util.ArrayList;
import java.util.List;interface G {
B apply(A a);
}interface F {
C apply(B b);
}interface FG {
C apply(A a);
}public class ComposeFunInJava {
public static void main(String[] args) {
G g = (s) -> s.length();
F f = (x) -> x % 2 != 0;
FG fg = (x) -> f.apply(g.apply(x));List<String> strings = Arrays.asList(new String[]{"a","ab","abc"}); List<String> result = new ArrayList(); for (String s : strings) { if (fg.apply(s)) { result.add(s); } } System.out.println(result); }
}
33行,差不多是 Kotlin 的3倍。 我们知道,Java是一门非常优秀的面向对象语言。但是在函数式编程方面,跟其他函数语言相比,还是显得有些笨重与生涩,并且其内在体现出来的思想,依旧是面向对象的思想。 而功能强大的Scala 语言,复杂性却相对较高,学习成本也远高于 Kotlin。 另外,Scala 与 Java 的互操作性没有 Kotlin 好。所以,如果我们既想方便地流畅地使用 Java 的强大且完善的生态库,又想使用更加先进的编程语言的特性,无疑 Kotlin 是个非常不错的选择。 我立马进入了Kotlin的世界。 Kotlin之前一直是默默无闻的,直到今年(2017)5.18 Google IO 大会上,Google宣布正式支持Kotlin为Android的官方开发语言,而且从Android Studio 3.0开始,将直接内置集成Kotlin而无需安装任何的插件。另外,在Spring 5.0 M4 中也引入了对Kotlin专门的支持。 在学习和使用Kotlin中,我发现我越来越喜欢 Kotlin,它是一门非常优秀、优雅有趣、流畅实用的语言,绝对值得一试。感谢Kotlin团队! 本书可以说是我对Kotlin的使用和思考过程的粗浅总结。通过本书的写作,加深了我对 Kotlin语言及其编程的理解,我深刻体会到了学无止境的含义。写书的过程也是我系统学习与思考Kotlin的过程,如果本书能够对你有所帮助,将不胜欣慰
( 摘自《Kotlin极简教程》 前言 )
解决 无用评论 打赏 举报
悬赏问题
- ¥15 C#调用python代码(python带有库)
- ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
- ¥15 活动选择题。最多可以参加几个项目?
- ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
- ¥15 vs2019中数据导出问题
- ¥20 云服务Linux系统TCP-MSS值修改?
- ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
- ¥20 怎么在stm32门禁成品上增加查询记录功能
- ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
- ¥50 NT4.0系统 STOP:0X0000007B