Kotlin 简介和特性
1. Kotlin 简介
Kotlin 是一种现代的、静态类型的编程语言,由 JetBrains 开发,旨在与 Java 完全互操作。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,使其在多种平台上都能使用。Kotlin 的设计目标是简洁、安全和互操作性,使其成为 Android 开发的首选语言之一。
1.1 Kotlin 的历史
Kotlin 于 2011 年由 JetBrains 首次公布,并于 2016 年正式发布 1.0 版本。2017 年,Google 宣布 Kotlin 成为 Android 开发的官方语言之一,这大大推动了 Kotlin 的普及。
1.2 Kotlin 的特性
- 简洁性:Kotlin 减少了样板代码,使代码更简洁易读。
- 安全性:Kotlin 通过可空类型和非空类型减少了 NullPointerException 的发生。
- 互操作性:Kotlin 与 Java 完全互操作,可以无缝调用 Java 代码,反之亦然。
- 多平台支持:Kotlin 不仅可以用于 Android 和 JVM,还可以用于 JavaScript 和 Native 平台。
2. 开发环境搭建
2.1 安装 IntelliJ IDEA
IntelliJ IDEA 是 JetBrains 开发的集成开发环境,支持 Kotlin 开发。你可以从 JetBrains 官网下载并安装 IntelliJ IDEA。
2.2 安装 Android Studio
Android Studio 是 Google 提供的官方 Android 开发环境,基于 IntelliJ IDEA,支持 Kotlin 开发。你可以从 Android 开发者官网下载并安装 Android Studio。
3. 第一个 Kotlin 程序
让我们编写第一个 Kotlin 程序,输出 "Hello, Kotlin!"。
fun main() {
println("Hello, Kotlin!")
}
3.1 代码解释
fun main():定义了一个名为main的函数,这是 Kotlin 程序的入口点。println("Hello, Kotlin!"):输出字符串 "Hello, Kotlin!" 到控制台。
4. 基本语法和数据类型
4.1 变量和常量
在 Kotlin 中,你可以使用 var 定义可变变量,使用 val 定义不可变常量。
var age: Int = 25
val name: String = "Kotlin"
4.2 数据类型
Kotlin 支持多种数据类型,包括:
- 数字类型:
Int,Long,Float,Double - 字符类型:
Char - 布尔类型:
Boolean - 字符串类型:
String
5. 条件语句
5.1 if 语句
val number = 10
if (number > 5) {
println("Number is greater than 5")
} else {
println("Number is 5 or less")
}
5.2 when 语句
when 语句类似于 Java 中的 switch 语句,但功能更强大。
val day = "Monday"
when (day) {
"Monday" -> println("It's Monday")
"Tuesday" -> println("It's Tuesday")
else -> println("It's another day")
}
6. 循环
6.1 for 循环
for (i in 1..5) {
println(i)
}
6.2 while 循环
var i = 1
while (i <= 5) {
println(i)
i++
}
6.3 do-while 循环
var i = 1
do {
println(i)
i++
} while (i <= 5)
7. 跳转表达式
7.1 break
break 用于终止循环。
for (i in 1..10) {
if (i == 5) {
break
}
println(i)
}
7.2 continue
continue 用于跳过当前循环的剩余部分,继续下一次循环。
for (i in 1..5) {
if (i == 3) {
continue
}
println(i)
}
7.3 return
return 用于从函数中返回值。
fun add(a: Int, b: Int): Int {
return a + b
}
8. 函数定义和调用
8.1 函数定义
fun greet(name: String): String {
return "Hello, $name!"
}
8.2 函数调用
val greeting = greet("Kotlin")
println(greeting)
9. 默认参数和命名参数
9.1 默认参数
fun greet(name: String = "World"): String {
return "Hello, $name!"
}
9.2 命名参数
val greeting = greet(name = "Kotlin")
println(greeting)
10. 单表达式函数
fun add(a: Int, b: Int) = a + b
11. Lambda 表达式
val sum = { x: Int, y: Int -> x + y }
println(sum(1, 2))
12. 高阶函数
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
val result = operate(3, 4) { x, y -> x * y }
println(result)
13. 类定义和实例化
13.1 类定义
class Person(val name: String, var age: Int)
13.2 实例化
val person = Person("Kotlin", 25)
println("Name: ${person.name}, Age: ${person.age}")
14. 构造函数和初始化块
14.1 主构造函数
class Person(val name: String, var age: Int) {
init {
println("Person initialized with name: $name and age: $age")
}
}
14.2 次构造函数
class Person(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
}
15. 属性和字段
class Person(val name: String, var age: Int) {
var address: String = ""
get() = field
set(value) {
field = value
}
}
16. 继承和接口
16.1 继承
open class Animal(val name: String)
class Dog(name: String) : Animal(name)
16.2 接口
interface Greeter {
fun greet(name: String): String
}
class Person(val name: String) : Greeter {
override fun greet(name: String): String {
return "Hello, $name!"
}
}
17. 数据类和密封类
17.1 数据类
data class User(val name: String, val age: Int)
17.2 密封类
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
18. 对象声明和表达式
18.1 对象声明
object Singleton {
val name = "Singleton"
}
18.2 对象表达式
val greeter = object : Greeter {
override fun greet(name: String): String {
return "Hello, $name!"
}
}
19. 可空类型和非空类型
19.1 可空类型
var name: String? = null
19.2 非空类型
var name: String = "Kotlin"
20. 安全调用操作符 (?.)
val length = name?.length
21. Elvis 操作符 (?:)
val length = name?.length ?: 0
22. 非空断言 (!!)
val length = name!!.length
23. 平台类型
val name: String! = "Kotlin"
24. List, Set, Map
24.1 List
val list = listOf("Kotlin", "Java", "Python")
24.2 Set
val set = setOf("Kotlin", "Java", "Python")
24.3 Map
val map = mapOf("Kotlin" to 1, "Java" to 2, "Python" to 3)
25. 可变集合和不可变集合
25.1 可变集合
val mutableList = mutableListOf("Kotlin", "Java", "Python")
mutableList.add("C++")
25.2 不可变集合
val immutableList = listOf("Kotlin", "Java", "Python")
26. 集合操作 (filter, map, reduce 等)
26.1 filter
val filteredList = list.filter { it.length > 4 }
26.2 map
val mappedList = list.map { it.toUpperCase() }
26.3 reduce
val sum = list.map { it.length }.reduce { acc, i -> acc + i }
27. 序列 (Sequence)
val sequence = sequenceOf("Kotlin", "Java", "Python")
val result = sequence.filter { it.length > 4 }.map { it.toUpperCase() }.toList()
28. 不可变性
val immutableList = listOf("Kotlin", "Java", "Python")
29. 纯函数
fun add(a: Int, b: Int): Int {
return a + b
}
30. 函数组合
fun compose(f: (Int) -> Int, g: (Int) -> Int): (Int) -> Int {
return { x -> f(g(x)) }
}
31. 柯里化
fun add(a: Int) = { b: Int -> a + b }
32. 协程基础
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello,")
}
33. 挂起函数
suspend fun fetchData(): String {
delay(1000L)
return "Data"
}
34. 协程上下文和调度器
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.IO) {
println("Running on ${Thread.currentThread().name}")
}
}
35. 通道和流
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
for (x in 1..5) channel.send(x * x)
channel.close()
}
for (y in channel) println(y)
}
36. 异步编程模式
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferred = async {
delay(1000L)
"Result"
}
println(deferred.await())
}
37. 泛型函数和类
37.1 泛型函数
fun <T> printList(list: List<T>) {
for (item in list) {
println(item)
}
}
37.2 泛型类
class Box<T>(val item: T)
38. 型变(协变和逆变)
38.1 协变
class Box<out T>(val item: T)
38.2 逆变
class Box<in T> {
fun setItem(item: T) {}
}
39. 类型投影
fun copy(from: Array<out Any>, to: Array<Any>) {
for (i in from.indices) {
to[i] = from[i]
}
}
40. 泛型约束
fun <T : Comparable<T>> max(a: T, b: T): T {
return if (a > b) a else b
}
41. 属性委托
class Example {
var p: String by Delegate()
}
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating '${property.name}' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to '${property.name}' in $thisRef.")
}
}
42. 类委托
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
43. 标准委托 (lazy, observable 等)
43.1 lazy
val lazyValue: String by lazy {
println("Computed!")
"Hello"
}
43.2 observable
import kotlin.properties.Delegates
var name: String by Delegates.observable("<no name>") {
prop, old, new ->
println("$old -> $new")
}
44. 类引用
val c = MyClass::class
45. 可调用引用
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))
fun isOdd(x: Int) = x % 2 != 0
46. 属性引用
val prop = MyClass::myProperty
println(prop.get(MyClass()))
47. 反射 API
import kotlin.reflect.full.*
class MyClass {
var myProperty: String = "Hello"
}
fun main() {
val kClass = MyClass::class
kClass.declaredMemberProperties.forEach { println(it.name) }
}