为什么你必须摒弃java,全面转向kotlin语言?

     2022-04-20     288

关键词:

是时候开始玩一门现代的编程语言了!

技术分享图片

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

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

尽管 Kotlin 最终编译成 JavaScript ,很快也将编译成 机器码,但我们仍将聚焦于其主要的环境 —— JVM。

这里有一堆你应该完全转向 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 = 4
val y = 7
print("sum of $x and $y is ${x + y}") // sum of 4 and 7 is 11

3# 类型推断

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

val a = "abc" // type inferred to String
val b = 4 // type inferred to Int
val c: Double = 0.7 // type declared explicitly
val 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", "[email protected]", 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 程序员总是活在各种空指针异常的恐惧中。

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

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

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

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

if (b == null) return
val 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 below
val x = b!!.length // same as above

16# 更好的 Lambdas

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

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

优点体现在:

如果 lambda 是方法的最后一个参数或者是唯一参数的话,那么方法的括号可以移动或者省略.
如果我们选择不去声明单参数的 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 代码执行后,会弹出窗口提醒你粘贴了 Java 的代码到 Kotlin 文件里。

喜欢小编轻轻点个关注吧!

金三银四必备,全面总结kotlin面试知识点(代码片段)

...支持盲区,对于一些语法背后的原理也有所涉猎。1.为什么要使用Kotlin?面试官问这个问题一方面可能是先想引入Kotlin这个话题,另一方面是想考察你的认知能力,是不是真的有思考过Kotlin的优势/价值,还是... 查看详情

你应该切换到kotlin开发(代码片段)

...xff1f;   我想告诉你一个名为Kotlin的新编程语言并且阐述为什么你应该考虑下一个项目中使用它。我以前非常喜欢使用JAVA,但是去年当我自己使用了Kotlin的时候,我真的不会在去想Java是一个更好的选择(语言上)。Kotlin是JetBrains公司... 查看详情

kotlin可以编译成c代码吗

...。。JAVA能做的事情,其实很多其他语言也能做到。。但为什么JAVA可以如此受欢迎?除了JAVA本身的强大之外,还有一个原因在于,JAVA与C#语言,几乎是一模一样的。只有非常细微的差别,不仅语法一样,而且连编程思想都一样。... 查看详情

做android开发怎么才能不被淘汰?,kotlin语言就是你最好的选择

...从招聘信息看到,kotlin和java语言已经是安卓开发师所必须具备的,所以学会这个也是至关重要的。我整理了一份详【Android版kotlin协程入门进阶实战】资料。第一章Kotlin协程的基础介绍协程是什么什么是Job、Deferred、协程... 查看详情

别扯了,kotlin真是项目开发必备吗

前言kotlin为什么那么受欢迎。Kotlin相比Java其最大的优势是什么?你是否考虑过切换到Kotlin,它是支持Android开发的热门语言。它在开发人员中迅速普及背后的原因是什么?一、简介Kotlin是一种在Java虚拟机上运行的静态... 查看详情

为什么推荐你用kotlin语言?

  谷歌大牛说:为什么Kotlin比你们用的那些垃圾语言都好  原标题:谷歌大牛说:为什么Kotlin比你们用的那些垃圾语言都好编译:伯乐在线/黄小非【伯乐在线/程序员的那些事导读】:5月18日,安卓团队在谷歌I/O2017... 查看详情

timsweeney解释为什么unrealengine4全面转向c++

摘自:https://forums.unrealengine.com/showthread.php?2574-Why-C-for-Unreal-4ThefirstthreegenerationsoftheUnrealEngineincludedasandboxedscriptinglanguage,UnrealScript,whichprovidedasimpleinterfacef 查看详情

如何学习kotlin编程语言

为什么说Kotlin是优秀的本文不会像一般介绍语言的文章那样,一开头就罗列出语言那些酷炫的特性,我们稍后再来探讨这些内容。首先我将介绍一些其它的信息,因为2013年一项研究显示,当开发者评估一种编程语言时生态系统... 查看详情

kotlin能取代java吗的最新相关信息

...。。JAVA能做的事情,其实很多其他语言也能做到。。但为什么JAVA可以如此受欢迎?除了JAVA本身的强大之外,还有一个原因在于,JAVA与C#语言,几乎是一模一样的。只有非常细微的差别,不仅语法一样,而且连编程思想都一样。... 查看详情

kotlin是后端开发的未来(代码片段)

...在学习Ktor,所以本文中的示例将使用Ktor进行说明。为什么选择kotlin?Kotlin是一种多范式编程语言。它支持来自其他各种语言的许多不同语言特性。如果缺少某个功能,在Kotlin中创建包含它的代码并不困难。例如,... 查看详情

timsweeney解释为什么unrealengine4全面转向c++

摘自:https://forums.unrealengine.com/showthread.php?2574-Why-C-for-Unreal-4ThefirstthreegenerationsoftheUnrealEngineincludedasandboxedscriptinglanguage,UnrealScript,whichprovidedasimpleinterfaceforgameplayprogrammingthatwasshieldedfromthecomplexityoftheC++engine.Thescriptingapproach... 查看详情

什么?你还不会用kotlin?一起跟着官方文档学习kotlin协程吧(代码片段)

为什么学Kotlin?Java用的挺好,为什么要学Kotlin?这是我之前的想法,但是越往后,这个想法慢慢的变淡。为什么?往下看:薪资以前找工作以Java为主,Kotlin优先(Kotlin属于加分项)现在找... 查看详情

你知道为什么用户选择kotlin而不是java进行后端开发吗?(代码片段)

...xff0c;您将了解在后端开发中使用Kotlin的主要原因。在解释为什么Kotlin更适合后端开发之前,让我们先了解一下Kotlin和Java。Kotlin和Java快速入门KotlinKotlin是由 查看详情

kotlin为什么可以和java混合开发(代码片段)

学!本文:https://www.jianshu.com/p/e3afe651052b文章目录前言Kotlin互操作性总结参考文献前言闲来无聊,和一个朋友聊天。他突然问我:你知道Kotlin和Java为啥可以混合开发相互调用么?我:???࿰... 查看详情

kotlin为什么可以和java混合开发(代码片段)

学!本文:https://www.jianshu.com/p/e3afe651052b文章目录前言Kotlin互操作性总结参考文献前言闲来无聊,和一个朋友聊天。他突然问我:你知道Kotlin和Java为啥可以混合开发相互调用么?我:???࿰... 查看详情

带你全面掌握高级知识点!java语言程序设计与数据结构基础篇

二、我们先来看看这份笔记到底有什么1、先把kubernetes跑起来(先跑起来+创建kubernetes集群+部署应用+访问应用+Scale应用+滚动更新)2、重要概念3、部署kubernetesCluster(安装docker+安装kubelet.kubeadm和kubect... 查看详情

jni实战全面解析

项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究。JNI是什么?JNI(JavaNativeInterface)意为Java本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。NDK是什么... 查看详情

kotlin元编程之ksp全面突破(代码片段)

什么是元编程没想到吧,这世上除了元宇宙,还有元编程,如果没有接触过,可能会有点懵,不过没关系,简单的说就是用代码来生成代码。实现元编程的传统常见手段主要是使用APT注解处理器+JavaPoet... 查看详情