准备
阅读对象
需要有Java基础的人类
Kotlin官网:
IntelliJ IDEA – the Leading Java and Kotlin IDE
开发工具:IDEA 官网下载
IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com)
撸代码
我们来看下kotlin官方的示例
fun main() {
val name = "stranger" // Declare your first variable
println("Hi, $name!") // ...and use it!
print("Current count:")
for (i in 0..10) { // Loop over a range from 0 to 10
print(" $i")
}
}
看下在IEDA中跑下看下运行结果
先创建项目
基本啥都都不用干就能跑起来,以上kotlin环境就搞定了。
环境版本信息如下:
IntelliJ IDEA 2022.3.2 (Community Edition)
Build #IC-223.8617.56, built on January 26, 2023
Runtime version: 17.0.5+1-b653.25 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 2042M
Cores: 4
Kotlin: 223-1.8.0-release-345-IJ8617.56
Kotlin的基本概念
(本段来自电子书《kotlin从入门到进阶实战》)
Kotlin是一种基于JVM的静态类型编程语言。Kotlin从开始推出至今 已经有7年,2016年官方正式发布了首个稳定版本。Kotlin发展简史如 下: 2011年7月,JetBrains推出Kotlin项目。 2012年2月,JetBrains以Apache 2许可证开源此项目。 2016年2月15日,Kotlin v1.0(第1个官方稳定版本)发布。 2017 Google I/O大会上,Kotlin“转正”。 Kotlin具备类型推断、多范式支持、可空性表达、扩展函数、模式 匹配等诸多下一代编程语言特性。 Kotlin的编译器kompiler可以被独立出来并嵌入到Maven、Ant或 Gradle工具链中。这使得在IDE中开发的代码能够利用已有的机制来构 建,可以在新环境中自由使用。
语言特性
- 实用主义(Pragmatic) 务实、注重工程实践性。我们经常会听到人们说编程是数学,或者 是工程,是艺术,是科学,这些说法都是很有道理的。Kotlin是一门偏 重工程实践、编程上有极简风格的语言。
- 极简主义(Minimalist) Kotlin语法简洁优雅不啰嗦,类型系统中一切皆是引用 (reference)。
- 空安全(Null Safety) Kotlin中有一个简单完备的类型系统来支持空安全。
- 多范式(multi-paradigm) Kotlin同时支持OOP与FP编程范式。各种编程风格的组合可以让我 们更加直接地表达算法思想和解决问题的方案,可以赋予我们在思考上 有更大的自由度和灵活性。
- 可扩展 Kotlin可直接扩展类的函数与属性(extension functions & properties)。这与我们在Java中经常写的util类是完全不一样的体验! Kotlin是一种非常注重用户体验的语言。
- 高阶函数与闭包(higher-order functions & closures) Kotlin的类型中,函数类型(function type)也是一等类型(first class type)。在Kotlin中可以把函数当成值进行传递,这直接赋予了 Kotlin函数式编程的特性,使用Kotlin可以写出一些非常“优雅”的代码。
- 支持快速实现DSL 有了扩展函数、闭包等特性的支持,使用Kotlin实现一个DSL将会 相当简单、方便。
Kotlin与Java完全互操作
Kotlin是基于JVM平台的静态编程语言,同时在设计之初就把与 Java的互操作性当作重要目标。正如官方网站所宣传的那样:100% interoperable with Java and Android。下面我们举个简单例子来展示Kotlin 中使用Java的ArrayList类与使用JUnit测试框架进行单元测试。代码示例 如下:
fun getArrayList(): List<String> { //(1)函数声明
val arrayList = ArrayList<String>() //(2)Kotlin中直接调用Java的API
arrayList.add("A")
arrayList.add("B")
arrayList.add("C")
return arrayList
}
代码说明如下。
(1):声明了一个返回List的函数,我们看到在Kotlin中使 用fun关键字来声明函数。
(2):创建了一个ArrayList对象,我们可以看到,在 Kotlin中创建对象不再使用new关键字了,尖括号里面的String是泛型信 息。该语法与Java语言基本类似。
扩展函数与扩展属性
扩展函数与扩展属性的“好玩”之处在于,可以在不修改原来类的条 件下自定义函数和属性,使它们表现得就像是属于这个类一样。例如, 我们给String类型扩展一个返回字符串首字母的firstChar()函数,代码如 下:
fun main() {
println("abc".firstChar()) //调用我们自定义的扩展函数
}
fun String.firstChar(): String {//给String类扩展一个firstChar()函数
if (this.isEmpty()) {//这里的this代表调用者对象
return ""
}
return this[0].toString()//返回下标为0的字符并转成String类型
}
不可空类型与空安全
使用Kotlin编程比Java更加安全,至少在空指针问题上写起代码来 会更加“开心”。Kotlin中引入了不可空类型与可空类型来明确声明一个 变量是否可能为null,同时在编译期通过类型是否匹配来检查空指针异 常,大大降低了空指针异常出现的概率。同时,Kotlin还提供了Elvis操 作符、安全调用符等极简的语法格式,使开发者从Java的null防御式编 程中被解放出来。例如下面的这段代码:
var a = "abc"
a= null //这段会编译报错
// Null can not be a value of a non-null type String
当声明了不可空类型String的变量a后,在后面使用变量a的代码中 就不能给a赋值为null。如果给a赋值null,编译器会直接报错。而这个时 候,如果我们想声明一个可空的String类型,可以这样写:
var b: String? = "abc" //声明一个可空的String?类型
但是这个时候,如果想调用变量b的方法,就不能直接像下面这样 写了:
b.length //可空类型不能直接调用方法,需要使用安全调用符?.或者断言调用!!.
//error:Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
如果在IDE中会直接提示报错,编译不通过。上面的代码可以使用 安全调用符进行如下改写:
b?.length //使用安全调用符
b=null
b?.length //null 对象使用安全调用符访问length属性,直接返回null
这个问号确实非常简洁易懂,同时能够时刻提醒我们:这个调用者 有可能是null的。这个语法明显比Java 8中引入的Optional更加简 单、直接。
一等函数支持
在Kotlin中函数是第一等类型(fist class):我们可以将函数像值一 样传递,函数可以作为另一个函数的返回值。我们通常称之为“一等函 数(first order functions)”支持。例如,下面是一个把函数作为参数传 递给函数的Lambda表达式的例子:
val list = listOf(1, 2, 3, 4, 5, 6, 7) //声明一个不可变的List
val res = list.filter { it % 3 != 0 }
println(res)
//res=[1, 2, 4, 5, 7]
智能类型推断
在上面的诸多例子中,可以看到在声明变量的时候并没有显式指定 它的类型。Kotlin编译器会自动推断出其类型。