44

Kotlin入门[持续更新] | Wazing blog

 4 years ago
source link: https://wazing.github.io/2019/06/05/Kotlin%E5%85%A5%E9%97%A8%5B%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%5D/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Kotlin入门[持续更新]

2019-06-05

| Kotlin

| 315

covrt.png

2019年05月08日凌晨的 Google I/O 大会上,Google 官方正式宣布,Kotlin 编程语言现在是 Android 应用程序开发人员的首选语言。

谷歌曾写道:“Android 的开发将越来越以 Kotlin 为先。”许多新的 Jetpack API 和特性将首先在 Kotlin 中提供。如果你要开始一个新项目,你应该用 Kotlin 来写;用 Kotlin 编写通常意味着更少的代码——更少用于类型、测试和维护方面的代码。”

就在两年前的 2017 年 I/O 大会上,谷歌宣布在其 Android Studio IDE 中支持 Kotlin。考虑到 Java 长期以来一直是 Android 应用程序开发的首选语言,这有点令人惊讶。在过去的两年里,Kotlin 的人气只增不减。谷歌说,超过 50% 的专业 Android 开发人员现在使用该语言开发他们的应用程序,在最新的 Stack Overflow 开发人员调查中,它被列为第四大最受欢迎的编程语言。

Android 的首席倡导者切特·哈斯 (Chet Haase) 表示:“我们宣布,我们正在采取的下一个重大举措是,我们将以 Kotlin 为先。”

哈斯说:“我们知道,不是每个人现在都在用 Kotlin,但是我们相信,你会需要它的。”“你可能有充分的理由继续使用 C++ 和 Java 编程语言,这完全没问题。这些语言不会消失。”

Kotlin 是一门与 Swift 类似的静态类型 JVM 语言,由 JetBrains 设计开发并开源。与 Java 相比,Kotlin 的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与 Java 高度可互操作,可以同时用在一个项目中。

Kotlin将现代语言的所有优势带入Android平台而不会引入任何新的限制:

  • 兼容性:Kotlin 与 JDK 6 完全兼容,保障了 Kotlin 应用程序可以在较旧的 Android 设备上运行而无任何问题。Kotlin 工具在 Android Studio 中会完全支持,并且兼容 Android 构建系统。
  • 性能:由于非常相似的字节码结构,Kotlin 应用程序的运行速度与 Java 类似。 随着 Kotlin 对内联函数的支持,使用 lambda 表达式的代码通常比用 Java 写的代码运行得更快。
  • 互操作性:Kotlin 可与 Java 进行 100% 的互操作,允许在 Kotlin 应用程序中使用所有现有的 Android 库 。这包括注解处理,所以数据绑定和 Dagger 也是一样。
  • 占用:Kotlin 具有非常紧凑的运行时库,可以通过使用 ProGuard 进一步减少。 在实际应用程序中,Kotlin 运行时只增加几百个方法以及 .apk 文件不到 100K 大小。
  • 编译时长:Kotlin 支持高效的增量编译,所以对于清理构建会有额外的开销,增量构建通常与 Java 一样快或者更快。
  • 学习曲线:对于 Java 开发人员,Kotlin 入门很容易。包含在 Kotlin 插件中的自动 Java 到 Kotlin 的转换器有助于迈出第一步。Kotlin 心印通过一系列互动练习提供了语言主要功能的指南。

Kotlin使用场景:

官网:https://kotlinlang.org/

官网(中文):https://www.kotlincn.net/

Hello world

国际惯例,先看看kotlin中的”Hello World!”

1
2
3
4
@JvmStatic
fun main(args: Array<String>) {
println("hello world!")
}

可以看到相对于Java中的语法,kotlin明显简洁许多

1
2
3
public static void main(String[] args) {
System.out.println("hello world!");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 使用 val 关键字定义的为常量
val num: Int = 1 // 立即赋值
val flag = true // 自动推断出'Int'类型
val name: String // 类似于java中的 final 修饰,需要立即赋值或在构造函数中赋值
name = "wazing"

// 使用 var 关键字定义的为变量
var size = 100 // 定义一个'Int'类型值为 100
size = 101 // 可修改值为 101

// 伴生对象(companion object{}),类似于Java中的static修饰
class KotlinRun {

companion object {

private const val TAG = "kotlin"

fun sum(a: Int, b: Int) = a + b
}
}

字符串拼接

1
println("$num --->>> $flag --->>> ${name}")

输出结果: 1 —>>> true —>>> wazing

fun 为修饰符,sum 为方法名,(a:Int,b:Int)为参数,:Int Int为返回值(每一个函数都有默认返回值Unit),下边为几种函数写法

1
2
3
4
5
6
// fun 为修饰符,sum 为方法名,括号内为参数,:Int 为返回值(每一个函数都有默认返回值Unit)
fun sum(a: Int, b: Int): Int {
return a + b
}

fun sum(a: Int, b: Int) = a + b

可空值及null检测

1
2
3
4
5
6
7
8
9
10
11
12
// 变量空值检测,在使用的时候就必须要判断是否为空
private var name: String? = null
// lateinit var 在调用前需要初始化值
private lateinit var address: String

@JvmStatic
fun main(args: Array<String>) {
name = "wazing"
println("$name")
// 异常 kotlin.UninitializedPropertyAccessException
println("$address")
}

输出结果:

wazing

Exception in thread “main” kotlin.UninitializedPropertyAccessException: lateinit property address has not been initialized

委托-属性延迟Lazy

委托有好几种,这里只简单说一下属性延迟lazy,默认情况下,对于 lazy 属性的求值是同步锁的(synchronized):该值只在一个线程中计算,并且所有线程会看到相同的值。如果初始化委托的同步锁不是必需的,这样多个线程可以同时执行,那么将 LazyThreadSafetyMode.PUBLICATION 作为参数传递给 lazy() 函数。 而如果你确定初始化将总是发生在单个线程,那么你可以使用 LazyThreadSafetyMode.NONE 模式, 它不会有任何线程安全的保证以及相关的开销。

1
2
3
4
5
6
7
8
9
10
private val text: String by lazy {
println("人类的本质")
return@lazy "复读机"
}

@JvmStatic
fun main(args: Array<String>) {
println("$text")
println("$text")
}

输出结果:

人类的本质
复读机
复读机

类型检测及自动类型转换

is 关键字类似于 java中的instanceof,如果需要去反值,则只需要在!is(加个!就行啦)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@JvmStatic
fun main(args: Array<String>) {
println("${getStringLength("hello world")}")
}

private fun getStringLength(obj: Any): Int {
if (obj is String) {
return obj.length
} else return -1
}

// 同上写法
private fun getStringLength(obj: Any): Int {
return if (obj is String) {
obj.length
} else -1
}

// 同上写法,去掉{}和返回值
private fun getStringLength(obj: Any) =
if (obj is String) {
obj.length
} else -1

区间range

1
2
3
4
5
val index = 2
if (index in 0..10) {
println("index的值在0-10区间中")
}
// 包含 0,1,2,3,4,5,6,7,8,9,10

数组和集合

1
2
3
4
5
6
// String类型数组
val strs: Array<String> = arrayOf<String>("Android", "iOS", "HongmengOS")
// List
val list: List<String> = listOf<String>("Android", "iOS", "HongmengOS")
// ArrayList,是List的子类,其中有add、remove、clear等拓展方法
val arrayList: ArrayList<String> = arrayListOf<String>("Android", "iOS", "HongmengOS")

for 循环

几种写法都一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
val list: List<String> = listOf<String>("Android", "iOS", "HongmengOS")
for (s in list) {
println(s)
}

for (i in 0 until list.size) {
println(list[i])
}

for (i in list.indices) {
println("$i --- ${list[i]}")
}

for (i in 0..list.size - 1) {
println("$i --- ${list[i]}")
}

for ((i, s) in list.withIndex()) {
println("$i --- $s")
}

when 表达式

比Java switch-case更强大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@JvmStatic
fun main(args: Array<String>) {
println(describe(1))
println(describe("hi"))
println(describe(true))
println(describe(null))
}

private fun describe(any: Any?): Any {
return when (any) {
1 -> "One"
"hi" -> "你好"
is Boolean -> any
!is String -> "Not String"
else -> "unknown"
}
}

输出结果:

One
你好
true
Not String

DTO

前面加data系统会自动添加getters(var类型还会添加setters()) equals() hashCode() toString() copy() 等等

1
data class People(val name: String, var age: String, var address: String?)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK