为什么你该摒弃 Java ,全面转向 Kotlin 语言? - 开源中国社区
为什么你该摒弃 Java ,全面转向 Kotlin 语言?
王练 2017年06月05日

为什么你该摒弃 Java ,全面转向 Kotlin 语言?

王练 王练 发布于2017年06月05日 收藏 75 评论 129

我想告诉你一个名为 Kotlin 的新的编程语言,以及为什么你要开始考虑使用它来开发你的下一个项目。我以前喜欢 Java ,但是去年我发现了 Kotlin ,只要有可能我就会用 Kotlin 来写代码。现在我实在无法想象有什么地方只有 Java 能做,而 Kotlin 不能的。

Kotlin 是 JetBrains 开发的,这是一家开发了一整套 IDEs 的公司,诸如 IntelliJ 和 ReSharper, 还有正在闪耀光芒的 Kotlin。这是一个务实而且简洁的编程语言,真正让人感觉身心愉悦的编程语言,而且效率非常高。

这里有一堆你应该完全转向 Kotlin 语言的理由:

0# Java 互操作性

Kotlin 是 100% 与 Java 具备互操作性的。你可以使用 Kotlin 继续你老的 Java 项目开发。所有你熟悉的 Java 框架仍然可用,任何框架,不管是 Kotlin 写的,还是你固执 Java 小伙伴写的都可以。

1# 熟悉的语法

Kotlin 不是诞生于学术界的怪异语言。其语法是 OOP 领域的任何开发者都熟悉的,可以或多或少的有一些了解。当然和 Java 还是有些不同的,例如重构后的构造函数以及使用 val 的变量声明等等。下面是一个基本的 Kotlin 示例代码:

class Foo {

    val b: String = "b"     // val means unmodifiable
    var i: Int = 0          // var means modifiable

    fun hello() {
        val str = "Hello"
        print("$str World")
    }

    fun sum(x: Int, y: Int): Int {
        return x + y
    }

    fun maxOf(a: Float, b: Float) = if (a > b) a else b

}

2# 字符串插值

这相当于是更智能,更具备可读性的 Java 的 String.format() 方法的 Kotlin 实现:

val x = 4val y = 7print("sum of $x and $y is ${x + y}")  // sum of 4 and 7 is 11

3# 类型推断

Kotlin 会自动的对变量的类型进行推断:

val a = "abc"                         // type inferred to Stringval b = 4                             // type inferred to Intval c: Double = 0.7                   // type declared explicitlyval d: List<String> = ArrayList()     // type declared explicitly

4# 智能类型转换

Kotlin 编译器会跟踪你的逻辑代码并在需要的时候进行自动的类型转换,这意味着我们不需要在显示转换时做更多的 instanceof 检查:

if (obj is String) {    print(obj.toUpperCase())     // obj is now known to be a String
}

5# 更直观的相等性比较

你不再需要调用 equals() ,因为 == 操作符也可以用来比较结构的相等性:

val john1 = Person("John")
val john2 = Person("John")
john1 == john2    // true  (structural equality)
john1 === john2   // false (referential equality)

6# 默认参数值

不需要像 Java 那样定义很多包含不同参数的相似方法:

fun build(title: String, width: Int = 800, height: Int = 600) {
    Frame(title, width, height)
}

7# 命名参数

结合默认参数值,命名参数可以消除 builders 的使用: 

build("PacMan", 400, 300)                           // equivalent
build(title = "PacMan", width = 400, height = 300)  // equivalent
build(width = 400, height = 300, title = "PacMan")  // equivalent

8# When 表达式

switch 替换成 when ,代码更具可读性:

when (x) {
    1 -> print("x is 1")
    2 -> print("x is 2")
    3, 4 -> print("x is 3 or 4")    in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")    else -> print("x is out of range")
}

支持表达式或者是语句,可以是有参数或者无参数:

val res: Boolean = when {
    obj == null -> false
    obj is String -> true    else -> throw IllegalStateException()
}

9# Properties

可以给公共字段自定义 set 和 get 行为,这意味着不再会因为那些没用的 getters & setters 导致代码疯狂膨胀。

class Frame {    var width: Int = 800    var height: Int = 600    val pixels: Int        get() = width * height
}

10# Data 类

这是一个 POJO 类,包含 toString()equals()hashCode(), 和 copy() 方法,和 Java 不同的是,它不会超过 100 行代码:

data class Person(val name: String,                  var email: String,                  var age: Int)val john = Person("John", "john@gmail.com", 112)

11# 操作符重载

可以重载预定义的一组操作符来提升代码的可读性:

data class Vec(val x: Float, val y: Float) {    operator fun plus(v: Vec) = Vec(x + v.x, y + v.y)
}val v = Vec(2f, 3f) + Vec(4f, 1f)

12# 解构声明

一些对象是可以解构的,一个很有用的例子就是对 Map 进行迭代:

for ((key, value) in map) {    print("Key: $key")    print("Value: $value")
}

13# Ranges

完全为了可读性:

for (i in 1..100) { ... } 
for (i in 0 until 100) { ... }for (i in 2..10 step 2) { ... } 
for (i in 10 downTo 1) { ... } 
if (x in 1..10) { ... }

14# 扩展函数

还记得你第一次用 Java 实现一个 List 的排序吗?你找不到一个 sort() 函数,然后你就四处求助,最终找到了 Collections.sort()。后来你需要将一个字符串的首字符变成大写,最终你还是自己写了一个方法来实现,因为你当时还不知道有这么个东西 StringUtils.capitalize().

如果只有一种方法可以向已有的类添加新的函数,这样 IDE 就可以帮助你在代码完成时找到正确的函数。在 Kotlin 里你可以这么做:

fun String.replaceSpaces(): String {    return this.replace(' ', '_')
}val formatted = str.replaceSpaces()

标准库扩展了 Java 原来类型的功能,这是字符串对象所需要的:

str.removeSuffix(".txt")
str.capitalize()
str.substringAfterLast("/")
str.replaceAfter(":", "classified")

15# Null 安全

Java 是我们应该称之为是一个几乎静态类型的编程语言。Java 的 String 变量类型无法保证它不会等于 null。尽管我们已经习惯了这样的情况,但它否定了静态类型检查的安全性,导致 Java 程序员总是活在各种空指针异常的恐惧中。

Kotlin 通过区分非空类型和允许为空类型来解决这个问题。类型默认是不允许为空的,可以通过在后面加一个 ? 问号来表示允许为空,例如:

var a: String = "abc"
a = null                // 编译错误var b: String? = "xyz"
b = null                // 正确

Kotlin 强制你必须在访问一个可为空的类型变量时候必须确保不会发生空指针:

val x = b.length        // 编译错误: b 允许为空

虽然看起来有点麻烦,但这的确是 Kotlin 一个微小却又非常重要的特性。我们仍可以使用智能的转换,可以在需要的时候将允许为空的类型转成不允许为空:

if (b == null) returnval x = b.length        // 正确

我们也可以使用安全调用方法 ?. 该表达式在 b 为空时返回 null,而不是抛出空指针异常:

val x = b?.length       // type of x is nullable Int

安全调用可以链接在一起,以避免像其他语言一样存在大量嵌套的 if-not-null 检查,如果我们想要一个默认值而不是 null 时,可以用 ?: 操作符:

val name = ship?.captain?.name ?: "unknown"

如果没有适合你的,那么你应该是需要一个空指针了,你将不得不显式的进行处理:

val x = b?.length ?: throw NullPointerException()  // same as belowval x = b!!.length                                 // same as above

16# 更好的 Lambdas

嘿,帅哥,这是一个很好的 Lambda 系统 —— 在完美的可读性和简洁之间取得非常好的平衡,这得益于非常聪明的设计选择。其语法简单直接:

val sum = { x: Int, y: Int -> x + y }   // type: (Int, Int) -> Intval res = sum(4,7)                      // res == 11

优点体现在:

  1. 如果 lambda 是方法的最后一个参数或者是唯一参数的话,那么方法的括号可以移动或者省略.

  2. 如果我们选择不去声明单参数的 lambda 表达式的参数,那么 Kotlin 会隐式的将之命名为 it.

结合上述优点,下面的三个不同的语句效果一样:

numbers.filter({ x -> x.isPrime() })
numbers.filter { x -> x.isPrime() }
numbers.filter { it.isPrime() }

这个可以让你编写更加简洁的函数式代码,就像下面这样优雅:

persons
    .filter { it.age >= 18 }
    .sortedBy { it.name }
    .map { it.email }
    .forEach { print(it) }

Kotlin 的 lambda 系统和扩展函数结合,可以非常棒的用来开发各种 DSL。例如 Anko 这个 DSL 的例子可以增强 Android 的开发:

verticalLayout {
    padding = dip(30)
    editText {
        hint = “Name”
        textSize = 24f
    }
    editText {
        hint = “Password”
        textSize = 24f
    }
    button(“Login”) {
        textSize = 26f
    }
}

17# IDE 支持

如果你打算开始使用 Kotlin 开发项目,在工具上你会有很多的选择。但我强烈推荐使用 IntelliJ ,因为它自带 Kotlin 的支持 — 它的特点展示了同一组人设计的开发工具和语言时的优势。

只是给你一个很小但有非常聪明的例子,这是我从 Stackoverflow 粘贴过来的 Java 代码执行后弹出的窗口:

 

IntelliJ 会提醒你粘贴了 Java 的代码到 Kotlin 文件里。

译文来源:可译网 译者:CY2

英文原文:Why you should totally switch to Kotlin

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:为什么你该摒弃 Java ,全面转向 Kotlin 语言?
分享
评论(129)
精彩评论
35
一般写这种文章的人都比较自私。
从来不会去考虑后续的人维护代码的成本。

万一别人不喜欢kotlin又要被逼着去学呢???

类似文章我可以搜出一大把:
为什么你该抛弃java,全面用groovy
为什么你该抛弃java,全面用scala
17
脑癌晚期
16
为什么我不学Kotlin,因为logo太丑。
12
学会了一种新语言,用来做早已能做的事情,浪费人生。
12
一看标题就知道瞎扯淡,摒弃Java,那么多Java库,别用啊!!
最新评论
0
换行有问题,改一下啊~~~
0

引用来自“双城记”的评论

一般写这种文章的人都比较自私。
从来不会去考虑后续的人维护代码的成本。

万一别人不喜欢kotlin又要被逼着去学呢???

类似文章我可以搜出一大把:
为什么你该抛弃java,全面用groovy
为什么你该抛弃java,全面用scala

引用来自“云淡V”的评论

服了,你不喜欢不学,维护代码成本很高么?代码看不懂?学习一个语言的成本很高么?一周足以,快的两三天就可以

引用来自“双城记”的评论

那我让你全部改成php,你不会学php,让你去学php去维护,你开心吗?
以自己为中心,从不去考虑别人实际情况的都是ZZ
有啥不开心的,你告诉我php对于Java的优势所在,我愿意改,做程序员就不要抱怨
0
个人觉得,服务器端真正在项目中运用还需要时间,主要是开发人员可能会有排斥情绪,不容易在项目中推行。但是一门新的语言,对个人开发人员来说,还是可以学习学习的,否则一直在java的世界里,容易坐井观天。
0
别人新开发一个语言,我们就捧上去,就工作需要还好说,要是自己职业规划也这么凑热闹,且看你怎么被牵着鼻子累死~
0
Java是和你们有什么深仇大恨?每出一个JVM系的语言都说 为什么你该抛弃java,全面用xxxx, 脑子进水? Java 20多年,经过了时间的考验,一个新的语言,出于兴趣的考验 我是赞同去学习和了解的,但是一款未经时间考验的语言?我凭什么要用来开发我公司的项目? 告诉我凭什么? 如果开口闭口简洁函数式之类的,我为何不用Ruby On Rails?,搞不懂你们这些人的想法, 你们爱换不换,目前我暂且不用 Kotlin 我用Java我偷着乐。
0
说得好,我选择c#
0

引用来自“双城记”的评论

一般写这种文章的人都比较自私。
从来不会去考虑后续的人维护代码的成本。

万一别人不喜欢kotlin又要被逼着去学呢???

类似文章我可以搜出一大把:
为什么你该抛弃java,全面用groovy
为什么你该抛弃java,全面用scala
还是要把一门技术深入,当深度达到后,广度就不是问题了。
0
基于JVM的各种语言陆陆续续出现了不少了,你见哪个成主流了?先让它和其他几个语言打个你死我活,什么时候出现在大学课本上了再来试图抢java的宝座吧
0
好丑陋的代码风格
0
我就知道评论120都是吐槽
0
这种文章少转少翻译
0
这种文章,去他妈B
0
学习成本与代码重构成本,还有团队的接受程度,以及这门语言的生态
0

引用来自“notreami”的评论

一看标题就知道瞎扯淡,摒弃Java,那么多Java库,别用啊!!
可以调用java类库
0

引用来自“双城记”的评论

一般写这种文章的人都比较自私。
从来不会去考虑后续的人维护代码的成本。

万一别人不喜欢kotlin又要被逼着去学呢???

类似文章我可以搜出一大把:
为什么你该抛弃java,全面用groovy
为什么你该抛弃java,全面用scala
服了,你不喜欢不学,维护代码成本很高么?代码看不懂?学习一个语言的成本很高么?一周足以,快的两三天就可以
0
kotlin的语法有问题,设计的个人觉着违反人的阅读习惯,短小的语法肯定是有其它不可抗的复杂特性掺杂其中,这是守恒的。java其实不错了,希望以后有几个主流编程语言能大一统,让苦逼程序员脱离学习苦海,并且大家互通性更强,创新高度将会大增。而不是今天你取代我,明天我取代你,语言最起码也得撑上一两百年吧,缓慢演变,这样才能不疲于奔命,结果程序员晚年必备颈椎病康复指导。。
0

引用来自“dush”的评论

为什么我不用kotlin:公司不让用!

引用来自“简单代码”的评论

用Kotlin意味着必须用InteliJ吧?收费的当然不可用了。

引用来自“eechen”的评论

Kotlin不依赖IDEA,可以单独下载命令行版本.
另外,免费开源的IDEA社区版也集成了Kotlin.
Android Studio用的就是免费开源的IDEA社区版,所以3.0版本也集成了Kotlin.
IDEA好处是提供了一个Java文件到Kotlin文件的转换工具.
其实我也不知道为什么Java开发者没了解过就要盲目抵触一门兼容Java的现代编程语言,
PHP开发者表示都看不下去了.
kotlin有eclipse插件的。
0
建议大家看原文. 翻译之后 格式惨不忍堵.
0
二傻子
1
写这篇文章的人,你该抛弃编程,全面拥抱非码农生活。
顶部