一、变量、常量和类型:
变量、常量以及 Kotlin 基本数据类型。变量和常量在 应用程序中可用来储值和传递数据。类型则用来描述常量或变量中保存的是什么样的数据。
1、声明变量:
// 变量定义关键字 —— 变量名 —— 类型定义 —— 赋值运算符 —— 赋值
var name : Int = 5
2 、Kotlin的内置数据类型:
3、只读变量:
Kotlin 提供了一种语法来声明只读变量,也就是说,变量一旦赋值就不能更改。
要声明可修改变量,使用 var 关键字。要声明只读变量,使用 val 关键字。
4、类型推断:
Kotlin 有个语言特性叫类型推断,对 于已声明并赋值的变量,它允许你省略类型定义。
var age = 5
val fristName = "Everbrilliant89"
5、编译时常量:
编译时常量只能在函数(指包括 main 在内的所有函数)之外定义。这是因为,编译时常量必须在编译时(程序编译时)赋值,而 main 和其他函数都是在运行时(程序运行时)才调用, 函数内的变量也是在那时赋值。编译时常量要在这些变量赋值前就已存在。
const val MAX_VALUE = 5000
二、条件语句:
1、if/else语句:
2、range :
在 in 1..5 中,..是一种操作符,表示某个范围(range)。范围包括从..操作符左侧的值到..操作符右侧值的一系列值。所以,1..5 包括 1、2、3、4、5。除了数字,范围也可以是一 系列字符。
3、when表达式:
when 表达式是 Kotlin 的另一个控制流工具。类似于 if/else 语句,when 表达式允许你编写条件式,在某个条件满足时,就执行对应的代码。它的语法比较简洁,非常适合有三到四个分支 的情况。
fun demoFunc() {
val faction = when(race) {
"dwarf" -> "Keepers of the Mines"
"gnome" -> "Keepers of the Mines"
"orc" -> "Free People of the Rolling Hills"
"human" -> "Free People of the Rolling Hills"
else -> "noName"
}
}
三、函数:
函数是能完成某项特定任务的可复用代码块,是编程非常重要的一部分。
1、函数结构的剖析:
一个函数的两个主要部分:函数头和函数体。
2、函数头:
- 修饰符:private、public、protected
- 函数声明关键字:fun
- 函数名:
- 函数参数:函数参数总是只读的,你不能在函数体内再给它们赋值。
- 函数返回类型
3、函数的作用域:
4、默认值参数:
参数列表中可以给参数赋值默认的值。
private fun castFirebal(numFireballs: Int = 2) {
println("A glass of Fireball springs into existence. (x$numFireballs)")
}
5、 单表达式函数:
函数都只有一个表达式语句,或者说都只有一条求 值语句。Kotlin 提供了更简单的方式来定义这类函数,对于这类单表达式函 数,返回类型、花括号、返回语句都可以省掉。
private fun castFirebal(numFireballs: Int = 2)
= println("A glass of Fireball springs into existence. (x$numFireballs)")
6、具名函数参数:
castFirebal(5)
//具名函数
castFirebal(numFireballs = 6)
7、Unit函数:
Kotlin 使用 Unit 返回类型表明这样一件事:函数没有返回值。函数定义 中如果没使用 return 关键字,那暗含的意思就是,Unit 就是这个函数的返回类型。
8、Nothing类型:
Kotlin 还有一种叫作 Nothing 的类型。类似于 Unit,Nothing 类型的函数也不返回任何东 西。但这是它们唯一相同的地方。在编译器看来,Nothing 就意味着函数不可能成功执行完成, 它要么抛出异常,要么因某个原因再也返不回调用处。
9、Java中的文件级函数:
Java 中,函数和变量都只能定义在类里,但 Kotlin 没有这样 的要求。
10、函数重载:
如果一个函数有多种实现,就可以说它被重载了。默认值参并 不是重载的唯一方式。你可以用相同的函数名定义多个实现。
11、反引号中的函数名:
定义或调用以空格和其他特殊字符命名的函数,不过,函数名要用一对反引号括起来。首先是支持 Java 互操作。Kotlin 提供了很多便利的工具,支持在 Kotlin 文件中调用现有 Java 代码的方法(Kotlin 和 Java 的互操作详见第 20 章)。Kotlin 和 Java 各自有不同的保留关键字,不 能用作函数名。使用反引号括住函数名就能避免任何潜在冲突。
在 Kotlin 中,is 是个保留关键字(你会在第 14 章中看到,Kotlin 的标准库有个 is 操作符, 可以用来检查实例类型)。而在 Java 中,is 不是关键字,所以是有效的方法名。有了反引号,就 可以在 Kotlin 中调用 Java 的 is 方法了。
四、匿名函数与函数类型:
定义时不取名字的函数,我们称之为匿名函数。匿名 函数和具名函数既相似又不同。明显的不同之处有两个:匿名函数的定义中没有名字;和其他代码交互的方式有点特别。匿名函数通常整体传递给其他函数,或者从其他函数返回。这种交互主 要靠函数类型和函数参数实现。
1、匿名函数:
把一个匿名函数作为参数传递给 count 函数:
val numLetters = "guangdongshenzhen".count({
letters -> letters == 's'
})
//匿名函数作为参数传入函数count
val numLetters1 = "guangdongshenzhen".count { letters ->
letters == 's'
}
//count函数在源码中的定义
public inline fun CharSequence.count(predicate: (Char) -> Boolean): Int {
var count = 0
for (element in this) if (predicate(element)) ++count
return count
}
- 函数类型:匿名函数也有类型,我们称其为函数类型(function type)。匿名函数可以当作变量值赋给函数类