qq_23693215 2017-09-20 04:59 采纳率: 0%
浏览 3

Kotlin有什么特性,能给例个例子吗

Kotlin与java相比,有哪些明显特性,能否举个例子说明下呢?

  • 写回答

1条回答 默认 最新

  • 禅与计算机程序设计艺术 人工智能领域优质创作者 2017-09-20 08:12
    关注

    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
    
      1. 比Groovy安全、更具工程实践性
      1. 比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