我为什么从 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。

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

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 中创建对象。

“主要”点

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.