为什么我从 Java 切换到 Kotlin

Kotlin 是一种跨平台、通用编程语言,对于熟悉 Java 的人来说,很容易上手。
96 位读者喜欢这篇文章。

从事教育工作多年之后,我成为了一名专业的软件开发人员。这让我接触到了 Java,但最近,我开始享受一种完全不同但兼容的编程语言,名为 Kotlin

Kotlin 是一种跨平台、通用编程语言,它运行在 Java 虚拟机 (JVM) 上。 JetBrains 在 2010 年开始领导其实现,并且自开发初期以来一直是开源的。

对于 Java 开发人员来说,好消息是 Kotlin 与 Java 具有互操作性。 标准 Java 代码可以包含在 Kotlin 程序中,Kotlin 也可以包含在 Java 程序中。 这种对兼容性的巨大投入意味着,如果您具有 Java 背景,那么上手 Kotlin 会感到熟悉,并且风险很低,因为它将与您的任何现有 Java 代码一起运行。

为了向您介绍 Kotlin,我将介绍它的一些基本语法,从变量到定义函数和类。 如果你想跟随学习该语言的一些特性,有一个很棒的基于浏览器的 Kotlin playground 可以使用。

变量

Kotlin 中的变量会让你感到熟悉。 以下是一些创建基本整数的示例

var I = 5
val j = 7
var k:Int = 8

varval 赋值之间存在细微但重要的区别:var 用于您可以重新赋值的变量,而 val 用于不会更改的局部范围值。 每个变量的类型都是可选的,因为可以推断出类型,类似于 JavaScript 中的动态赋值。 还有可空赋值,它使用如下语法

var f: Int? = 9

这意味着分配的值可以等于 null。 使用 null 的原因超出了本文的范围,但重要的是要知道,只有在明确定义变量等于 null 时,该变量才能等于 null。

如果您计划定义一个没有初始实例化(值)的变量,则必须将类型放在变量名之后

var s: Int

字符串的组成方式类似,类型也位于变量名之后

val a:String = "Hello"

字符串在 Kotlin 中具有超能力。 它们包括很棒的字符串模板函数,您可以探索

数组

另一种基本类型是数组。 它可以存储预先确定数量的相同定义类型的对象。 在 Kotlin 中,有几种不同的方法来创建数组,例如

val arrA = arrayOf(1,2,3)
val arrB = arrayOfNulls<Int?>(3)
val arrC = Array<Int?>(3){5}

第一个创建一个长度为 3 的数组,元素为 1、2 和 3; 第二个创建一个类型为可空整数的 null 数组; 第三个创建一个可空整数数组,每个元素都等于 5。

要检索其中一个元素,请使用括号表示法,从零开始。 因此,要检索第一个数组中的第一个元素,请使用:arrA[0]

集合

在 Kotlin 中分组对象的其他方法通常称为集合。 Kotlin 中有几种类型的集合。 每种都可以是可变的(可更改/可写)或不可变的(只读)。

  • 列表: 有序的项目组可以包含重复的项目,并且必须是相同的类型。 可以像这样形成可变列表
    var mutList = mutableListOf(7,5,9,1)
    val readList = listOf(1,3,2)
  • 映射: 映射类似于 Java 中的 HashMap,按键和值组织。 键必须不同。 它们像这样实例化
    var mapMut = mutableMapOf(5 to "One", 6 to "Five" )
    val mapRead = mapOf(1 to "Seven", 3 to "six")
  • 集合: 集合是一种数据结构,其中组中的每个对象都是唯一的。 它们像这样创建
    var setMut  = mutableSetOf(1,3, 5, 2)
    val readSet = setOf(4,3,2)

每当您尝试重新分配不可变对象时,您将收到一条语法错误,指出 Val cannot be reassigned。 当您有一个永远不希望被程序的任何部分编辑的集合时,此行为会派上用场。

函数

函数是良好软件程序的基础。 存储为函数的可重复代码位可以重用,而无需一遍又一遍地重写相同的命令。 在 Kotlin 中,创建函数的标准语法是

fun doSomething(param1:String): Unit{
println("This function is doing something!");
}

此示例函数接受一个字符串作为唯一参数; 正如您所看到的,参数类型放在参数名称之后。 当函数不返回值时,Unit 对象是 Kotlin 中等效于 Java 的 void(虽然 Unit 是一个值——并且只有一个值——因为它是一个单例)。 Kotlin 函数的工作方式与 Java 和其他一些语言中的函数非常相似。

Kotlin 中的类与其他面向对象编程 (OOP) 语言中的类非常相似,这些语言将对象/类视为基本构建块。 类使用以下语法创建

class ExampleClass{}

默认情况下,类具有一个主构造函数,可用于设置对象属性,而无需编写用于 getter/setter(访问器/修改器)的代码。 这使得创建对象并开始使用它变得容易,而无需太多样板代码。 主构造函数不能包含实现代码,只能包含参数

public class ExampleClass constructor(type:String)

要编写主构造函数实现,您可以在类中使用 init

init{
val internalType:String = type
}

或者您可以通过在每个参数前面放置 valvar 在构造函数中初始化它

public class ExampleClass constructor(var type:String, var size:Int)

尽管这并没有深入研究类、属性和可见性修饰符,但它应该让您开始在 Kotlin 中创建对象。

"main" 要点

Kotlin 文件具有 .kt 文件扩展名。 要开始运行 Kotlin 文件,编译器会在文件中查找 main 函数; 因此,一个基本的“Hello World”程序看起来像这样

fun main(args:Array<String>){
println("Hello World")
}

很简单,对吧?

Kotlin 是一种高级但直观的 OOP 语言,它可以简化和精简用于移动设备、服务器端、Web 和数据科学应用程序的 Java 开发。 我发现它的语法和配置比 Java 简单得多。

例如,比较 Java 中的 print 语句

System.out.println("Hi")

与 Kotlin 的语法对比

println("Hello")

此外,getter 和 setter 不需要额外的库即可进行简单实现。 在 Java 中,像 Lombok 这样的库通过注释简化了类/对象属性设置。 在 Kotlin 中,可以使用属性轻松实现类

class Person {
	var firstName: String =""
	var lastName: String =""
	var age: Int? = null
	var gender: String? = null
}

可以使用以下语法检索或设置这些属性

var me = Person()
me.firstName = “Stephon”
me.lastName = “Brown”

Kotlin 的简单性和 Java 互操作性意味着您花费时间学习无用的东西的风险很小。 在踏出 Kotlin 的第一步之后,您可能再也不会以相同的方式看待您的 Java 代码或 JVM。

接下来要阅读什么
标签
User profile image.
Stephon 目前担任开发顾问。 他每天和家人一起练习跆拳道,摆弄新技术,并研究要写的主题。

7 条评论

为什么我会坚持使用 Java?
Stephon Brown 说的:D

你好 Stephon,

我真的很喜欢这篇文章。 我有一个问题。 学习 Kotlin 需要先掌握 Java 编程知识吗?

我在大学里学过 Java,但从未在专业领域中使用过它。 如果我想开发 Android 应用程序,我可以从 Kotlin 入手吗?

谢谢

Ciao!

在我看来,我不得不说不。 Java 不是学习 Kotlin 的先决条件。

了解 Java 将揭开与 JVM 相关的许多架构方面的神秘面纱,并为您提供 Java 中的扩展库,但没有必要对 Kotlin 的使用有一个完整而深入的了解。

Jet Brains 甚至提供了非常详尽的演练,称为 Koans:https://kotlinlang.org/docs/tutorials/koans.html

回复 作者 Learner

我没看到最后一段中的属性 getter 和 setter? 实际上,我觉得作者不知道它们是什么。
否则,Kotlin 给我的印象非常深刻。 var 或 val,所有东西的关键字,不清晰的类型... 这东西太乱了。
如果您想要一种不错的语言,请看看 Typescript。

你好 Milan,

一旦您在类中声明一个属性,就会自动实现 getter/setter; 因此,使用文章中的示例,me.firstName 可用于检索和设置属性“firstName”。 此外,您可以使用此处概述的不同语法对属性进行更复杂的实现:https://kotlinlang.org/docs/reference/properties.html

虽然我同意 Kotlin 的某些方面乍一看可能有点不清楚/复杂,但我不同意 Typescript 像从 Java(一种 OOP 语言)过渡那样容易掌握,因为它子集是基于原型的语言 Javascript。

回复 作者 Milan (未验证)

很棒的文章!!

一个问题,对于像接口这样的抽象,抽象类来支持设计模式,Kotlin 是否都支持? 顺便问一句,为什么不是 Scala 而不是 Kotlin?

干杯,

嗨 Bruno,

Kotlin 直接支持抽象:https://kotlinlang.org/docs/reference/interfaces.html
它们使用与 Java 相同的一些关键字,如果您想避开 Kotlin 语法,可以创建一个 POJO,并通过这种方式创建您的抽象。

至于 Scala,老实说,我没有深入研究。 在用 Java 编程之后,我被 Kotlin 简洁明了的语法深深吸引。 我确实看到 Scala 是一种 JVM 兼容的语言,并且语法与 Java 非常相似,但我还是想尝试一些不同的东西。

回复 作者 brunoamuniz

知识共享许可协议本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.