Kotlin--阿里一线专家带你探索实践第三十一期
2017年09月20日--2017年09月25日 分享到:

Kotlin作为Android官方支持的开发语言越来越受到程序员的欢迎:简洁的语言、与Java的无缝互译、很棒的IDE支持、且不断进化和对其他语言的思想的借鉴,如果你刚刚从事或者一直从事Android开发,Kotlin都将成为你很好的起点或新的助手。
本期专家问答我们请来了《 Kotlin极简教程 》一书作者 陈光剑 来为大家解答相关问题。

本期问答内容
1.Kotlin 有什么特性?
2.Kotlin 在 Android 中有什么优势?
3.Kotlin 未来发展前景如何?
4.学习 Kotlin 难度怎么样?

作者简介:
陈光剑
这里写图片描述

资深开发人员,目前就职于阿里巴巴集团,参与过多种平台工具的开发,具有丰富的平台开发经验,操练过Java、Android、Scala、Groovy等语言进行领域建模、架构设计、工具开发,在工作中积累了大量经验,善于总结,乐于分享,发布过大量技术文章。

为了营造更好的问答氛围,我们不欢迎一切与主题无关的讨论、灌水。欢迎大家踊跃提问,陈光剑老师会为大家解答问题,并在活动结束后抽取三位幸运用户赠送《 Kotlin极简教程 》实体书一本

这里写图片描述

已结束
本期嘉宾 1505790488 69411 陈光剑 资深开发人员,目前就职于阿里巴巴集团,参与过多种平台工具的开发,具有丰富的平台开发经验,操练过Java、Android、Scala、Groovy等语言进行领域建模、架构设计、工具开发,在工作中积累了大量经验,善于总结,乐于分享,发布过大量技术文章。
2 qq 23693215 qq_23693215 2017.09.20 12:59提问
Kotlin有什么特性,能给例个例子吗

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

2 universsky2015 universsky2015 2017.09.20 16: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极简教程》 前言 )

universsky2015
universsky2015 许多语言似乎都是源于对某种其它语言的厌倦。JetBrains的工程师仍然将Java视为一门优秀的语言。只是,Java太成熟了,改进和增加特性比较困难,因为要保持向后兼容。Kotlin所做的工作就是吸取Java和其它语言的经验和教训,并以 Java 为基础进行改进。
4 个月之前 回复
共7条数据 首页 1 3