第 1 章 Kotlin应用开发初体验

第 1 章 Kotlin应用开发初体验

本章,你将学习使用IntelliJ IDEA开发首个Kotlin应用。借此,你将熟悉开发环境,创建Kotlin新项目,编写并运行Kotlin代码,以及查看输出结果。本章创建的是一个沙盒项目,可供你演练代码,以学习理解本书中的各种新概念。

1.1 安装IntelliJ IDEA

IntelliJ IDEA是一套Kotlin集成开发环境。JetBrains公司创建了Kotlin语言并打造出了这套开发工具。开始学习前,请先访问JetBrains公司网站https://www.jetbrains.com/idea/download,下载IntelliJ IDEA社区开发版软件(见图1-1)。

图1-1 下载IntelliJ IDEA社区开发版软件

下载完毕后,请参考https://www.jetbrains.com/help/idea/install-and-set-up-product.html网页,完成对应平台IntelliJ IDEA开发工具的安装与配置。

IntelliJ IDEA简称IntelliJ,能帮助开发者编写风格良好的Kotlin代码。利用其内建工具,运行、调试、检查以及重构代码的整个开发过程能无缝衔接,一气呵成。有鉴于此,我们推荐使用IntelliJ做Kotlin开发。若想进一步了解使用IntelliJ做Kotlin开发的理由,请阅读1.4节。

1.2 第一个Kotlin项目

恭喜你,Kotlin语言及强大的开发环境都有了,接下来只剩一件事要做:学会流畅运用Kotlin语言。作为首个练手任务,我们来创建一个Kotlin项目。

启动IntelliJ。如图1-2所示,映入眼帘的是IntelliJ IDEA的欢迎界面。

图1-2 欢迎界面

(若非首次安装使用,IntelliJ会直接打开上一个项目。要回到欢迎界面,选择File → Close Project关闭项目即可。)

单击Create New Project选项,会看到如图1-3所示的创建新项目对话框。

图1-3 创建新项目对话框

在创建新项目对话框中,选择左侧的Kotlin选项,然后选择右边出现的Kotlin/JVM选项,结果如图1-4所示。

图1-4 创建一个Kotlin/JVM项目

除了Kotlin,IntelliJ还支持Java、Python、Scala以及Groovy等其他编程语言。选择Kotlin/JVM就是告诉IntelliJ你要用Kotlin编程。更确切地讲,就是要编写面向并且在Java虚拟机上运行的Kotlin代码。顺便提一下,Kotlin还有个优势:内置的工具链支持编写能在不同操作系统和平台上运行的Kotlin代码。

(从现在起,提到Java虚拟机,本书都以Java开发社区常用的JVM来替代。1.5节还会介绍更多有关面向JVM的知识。)

单击Next按钮继续。你会看到新项目设置界面,如图1-5所示。输入“Sandbox”作为项目名称,IntelliJ会自动给出默认项目路径。如有需要,可以单击右侧的…按钮自定义项目路径。在Project SDK的下拉框中点选Java 1.8,这样,新项目就关联上了JDK 8。

图1-5 给新项目命名

你可能会问,编写Kotlin程序为什么需要JDK?答案就是,为了把Kotlin代码转译为字节码(稍后详述),IntelliJ需要JDK提供JVM和Java工具。理论上讲,JDK 6及其后的版本都能用,但是经验表明,至本书撰稿之时,还是JDK 8用起来更顺畅。

如果在Project SDK下拉框里看不到Java 1.8,说明你还没有安装过JDK 8。继续学习之前,请先访问https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,下载相应平台的安装包完成安装,然后重启IntelliJ使其生效。最后,按照前述步骤从头开始创建新项目。

言归正传,确认新项目设置如图1-5所示,然后单击Finish按钮。

如图1-6所示,IntelliJ随即创建一个名为Sandbox的新项目,并在默认的双面板视图里显示出来。反映在硬盘上,IntelliJ会在项目指定路径创建一个文件夹、一系列子文件夹以及对应的项目文件。

图1-6 默认的双面板视图

图1-6中,左面板显示的是项目工具窗口。右面板现在空着。待会你会看到,这里会显示编辑器窗口,供你查看和编辑Kotlin代码文件。先来看左边的项目工具窗口。单击项目名称Sandbox左侧的展开箭头,可以展现项目包含的文件,如图1-7所示。

图1-7 项目视图

在IntelliJ中,项目既包含我们应用的所有源代码,也包含有相关的依赖和配置信息。项目可以分成一个或多个类似于子项目的模块。新建项目默认含有一个模块,对于简单的Kotlin项目来说,一个就够了。

如图1-7所示,Sandbox.iml文件包含项目模块的配置信息。.idea文件夹存放整个项目的设置文件,以及用户在IDE中和项目交互相关的设置文件(例如,当前编辑器打开了哪个文件)。上述文件都是系统自动生成的,现在不用管它们。

External Libraries项包含项目依赖库的信息。单击展开该项,可以看到,IntelliJ已自动为项目添加了Java 1.8以及KotlinJavaRuntime依赖库。

(想了解更多有关IntelliJ项目结构的知识,请访问JetBrains文档网址:https://www.jetbrains.org/intellij/sdk/docs/basics/project_structure.html。)

src文件夹用来存放为Sandbox项目创建的所有Kotlin代码文件。好了,是时候来创建并编辑首个Kotlin代码文件了。

1.2.1 创建首个Kotlin文件

在项目工具窗口中,右击src文件夹。如图1-8所示,在弹出的菜单中,依次选择New和Kotlin File/Class菜单项。

图1-8 新建一个Kotlin文件

在New Kotlin File/Class对话框中,在Name处输入文件名“Hello”,保持Kind处的File选项不变(见图1-9)。

图1-9 给Kotlin文件命名

单击OK按钮确认。如图1-10所示,IntelliJ随即新建了src/Hello.kt这样一个项目文件,同时在IntelliJ右边窗口的编辑器里打开该文件。我们知道,.java后缀用于Java文件,.py后缀用于Python文件,同样,.kt后缀说明新建文件存放着Kotlin代码。

图1-10 编辑器中的Hello.kt空文件

现在,可以开始编写Kotlin代码了。在Hello.kt编辑器中,动动手,输入代码清单1-1所示的代码。(注意,本书中所有需要读者输入的代码都显示为粗体。)

代码清单1-1 “Hello,World!”Kotlin语言版(Hello.kt)

fun main(args: Array<String>) {
    println("Hello, world!")
}

不太明白刚刚输入的代码?不要担心,学完本书,你一定能自然、流利地读写Kotlin代码。现在只要大致知道是输出“Hello,World!”字符串就可以了。

代码清单1-1中的代码定义了一个main函数。函数实际就是一组可以稍后运行的代码指令。我们将在第4章中具体学习如何定义并使用函数。

对于Kotlin语言来讲,main函数有特别的意义。它是应用程序开始启动的地方,又称为应用程序入口点。Sandbox或任何应用程序要能运行,都必须定义这样的入口点。本书编写的所有应用程序都从main函数开始启动。

上述代码中的main函数仅包含一条指令(也叫语句):println("Hello, world!")println()也是个函数,内置于Kotlin标准库中。Sandbox应用程序一旦运行,println("Hello, world!")就会执行,IntelliJ随即在屏幕上输出圆括号中的Hello, world!字符串。

1.2.2 运行Kotlin文件

如图1-11所示,一旦输入完代码清单1-1中的代码,在第一行代码左侧,会出现一个绿色的运行按钮 {%}。(如果绿色运行按钮没出现,或者Hello.kt文件名或某段代码下方被打上了红色波浪线,则说明代码有误,请对照代码清单1-1仔细核对修改。另外,如果看到Kotlin的红蓝K标志也没问题,它相当于运行按钮。)

图1-11 运行按钮

代码无误的话,Hello, world!应用程序就可以运行了。如图1-12所示,单击运行按钮,选择Run ‘HelloKt’菜单项。这相当于告诉IntelliJ,你想看着应用程序运行起来。

图1-12 运行Hello.kt文件

应用程序运行时,IntelliJ就一行一行执行花括号({})里的代码,同时在IDE界面底部显示两个新工具窗口,如图1-13所示。

图1-13 运行和事件日志工具窗口

图1-13中,左边是运行工具窗口,又叫控制台(后续都这样称呼)。控制台显示IntelliJ执行应用程序时产生的各种信息,也包括应用程序本身的输出。就本例来说,你会看到控制台显示Hello, world!字符串,还会看到标志应用程序成功执行的语句:Process finished with exit code 0。这条语句会出现在控制台各种输出信息的最后。你知道就好,本书后续截图将不再包括此信息。

(macOS用户可能会看到红色的错误文本,指出JavaLauncherHelper有问题,如图1-13所示。不要担心。这是在macOS上安装Java运行时环境的方式所带来的副作用。要想移除它得费一番工夫,不过这个问题并没有什么影响,所以你大可忽略它,继续操作。)

图1-13中,右边是事件日志工具窗口。该窗口显示IntelliJ为应用程序执行所做工作的相关信息。显然,控制台才是我们要关心的地方,所以事件日志窗口后续不会再提起。(同理,你也不用管事件日志窗口在应用程序运行时是否打开。)要关闭事件日志窗口,单击右上角的隐藏按钮 {%} 即可。

编译并运行Kotlin代码

从点选Run ‘HelloKt’菜单项至控制台输出Hello, World!结果只需很短的时间,但后台实际已忙活了不少事。

首先,IntelliJ使用kotlinc-jvm编译器编译Kotlin代码。具体来讲,就是把Kotlin代码转换为JVM语言:字节码。转换过程中,如有问题,kotlinc-jvm会报错并给出排错提示;一切顺利的话,IntelliJ就进入执行阶段。

在执行阶段,kotlinc-jvm生成的字节码会在JVM上执行。控制台随后会打印程序输出,例如,在JVM一条条执行指令时,调用println()函数会输出传入其中的文字。

字节码指令执行完毕后,JVM随即终止。IntelliJ在控制台显示终止状态,告诉用户执行成功完成或是有错并给出错误码。

第2章会深入探讨字节码的相关知识,不过,这里要说的是,即使不能完全理解Kotlin的编译过程,也不妨碍你阅读本书。

1.3 Kotlin REPL

就像拿张稿纸就某个计算一步步演算那样,有时候,你可能需要测试一小段Kotlin代码,看看运行结果如何。这在学习Kotlin语言时非常有用。幸运的是,IntelliJ就提供了这种工具,能够实现无须创建文件就快速测试代码。该工具叫作Kotlin REPL。稍后会解释REPL的含义,现在先打开它,看看能用它做些什么。

如图1-14所示,在IntelliJ中,选择Tools → Kotlin → Kotlin REPL打开Kotlin REPL工具窗口。

图1-14 打开Kotlin REPL工具窗口

如图1-15所示,IntelliJ会在底部显示REPL窗口。

图1-15 Kotlin REPL工具窗口

你可以在里面输入代码,就像使用代码编辑器一样,但有一点不同:REPL不用编译整个项目,就能立即给出结果。

在REPL中输入代码清单1-2所示的代码。

代码清单1-2 “Hello, Kotlin!”(REPL)

println("Hello, Kotlin!")

输入完成后,按Command-Return(Ctrl-Return)组合键在REPL中执行代码。如图1-16所示,很快,你就会在下面看到Hello, Kotlin!输出结果。

图1-16 执行代码

REPL是英文单词read(读取)、evaluate(求值)、print(输出)和loop(循环)的首字母缩写。整个运转流程如下:在提示符下输入一段代码,然后单击REPL左侧的绿色运行按钮或按Command-Return(Ctrl-Return)组合键提交。REPL读取代码,代码求值(运行代码),输出结果或副作用结果。运行完毕,REPL交回控制权,循环再次开始。

Kotlin之旅已然启航!你在本章学了不少内容,已为进一步掌握Kotlin编程打下基础。下一章,你将开始探索Kotlin语言的细节,学习如何使用变量、常量以及各种数据类型。

1.4 深入学习:为什么要用IntelliJ

任何文本编辑器都可以用来编写Kotlin代码,不过,我们推荐使用IntelliJ,尤其是在学习这门语言的时候。如同凭借文字处理软件的拼写和语法检查功能,能更轻松地写出规范的文章一样,IntelliJ也更便于编写规范的Kotlin代码。这主要体现在以下几个方面。

  • 借助语法高亮、内容提示和代码自动补全等功能,你可以编写出语法和语义正确的代码。
  • 借助应用程序运行时的断点调试和实时代码步进,你可以边运行边调试代码。
  • 借助重构快捷命令(如重命名、导出常量)以及清理缩进和空行的代码格式化功能,你可以重构现有代码。

而且,由于Kotlin和IntelliJ都出自JetBrains公司,它们之间的集成设计更为细致周全,为用户带来了愉快的开发体验。另外,Android Studio基于IntelliJ开发,所以使用IntelliJ时学会的快捷操作和工具都可以直接运用。

1.5 深入学习:面向JVM

JVM本质上是个软件,它知道如何执行字节码指令。“面向JVM”就是把Kotlin代码编译或转译成Java字节码,以实现在JVM上运行,如图1-17所示。

图1-17 编译和执行流程

Windows平台也好,macOS平台也罢,它们都有各自的指令集。JVM搭起了字节码与不同软硬件平台间的桥梁,读取字节码并调用平台特有的与之匹配的指令。显然,不同软硬件平台有不同版本的JVM。这样一来,Kotlin开发人员就可以编写平台独立的程序代码,无论什么系统平台,都可实现一次编写,然后编译成字节码,在不同设备上执行。

既然能转换成JVM可以执行的字节码,Kotlin也就是JVM语言。作为首门JVM语言,Java最为知名。在后来者,如Scala和Kotlin语言中,开发人员扬长避短,已消除了“前辈”Java的一些弊端。

不过,Kotlin并未局限于JVM。本书撰写之际,Kotlin已能编译成JavaScript,甚至能脱离虚拟机层,直接编译成可以在Windows、Linux和macOS平台上运行的原生二进制代码。

1.6 挑战练习:使用REPL研究Kotlin中的算数运算符

本书很多章最后都配有挑战练习。请独立完成它们,以加深对Kotlin语言的理解,积累更多经验。

使用REPL研究Kotlin中的+-*/以及%这些算数运算符是如何工作的。例如,在REPL中,尝试输入(9+12)*2。结果符合预期吗?

还想深入研究的话,可以看看https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.math/index.html网页列出的Kotlin标准库里的数学函数,在REPL里做做演练。例如,试试minOf (94, -99),求出最小值。

目录

  • 版权声明
  • 献词
  • 致谢
  • 前言
  • 第 1 章 Kotlin应用开发初体验
  • 第 2 章 变量、常量和类型
  • 第 3 章 条件语句
  • 第 4 章 函数
  • 第 5 章 匿名函数与函数类型
  • 第 6 章 null安全与异常
  • 第 7 章 字符串
  • 第 8 章 数
  • 第 9 章 标准库函数
  • 第 10 章 List与Set
  • 第 11 章 Map
  • 第 12 章 定义类
  • 第 13 章 初始化
  • 第 14 章 继承
  • 第 15 章 对象
  • 第 16 章 接口与抽象类
  • 第 17 章 泛型
  • 第 18 章 扩展
  • 第 19 章 函数式编程基础
  • 第 20 章 Kotlin与Java互操作
  • 第 21 章 用Kotlin开发首个Android应用
  • 第 22 章 Kotlin协程简介
  • 第 23 章 编后语
  • 附录 A 补充挑战练习
  • 术语表