目录
1.2 用表达式代替 condition ? then : else if
1、条件表达式
1.1 if语句
语法与Java无异
if (count == 42) {
println("I have the answer.")
} else if (count > 35) {
println("The answer is close.")
} else {
println("The answer eludes me.")
}
不难发现String语句总是重复出现,Kotlin提供一种条件表达式简化以上重复
//根据 if-else 表达式的结果
//为 answerString 赋予了一个初始值
val answerString: String = if (count == 42) {
"I have the answer."
} else if (count > 35) {
"The answer is close."
} else {
"The answer eludes me."
}
println(answerString)
//每个条件分支都隐式地返回其最后一行的表达式的结果
//因此无需使用 return 关键字
1.2 用表达式代替 condition ? then : else
if
Kotlin 中没有三元运算符,即condition ? then : else if
- 一元运算符:只需要一个数据就可以进行操作的运算符。例如:取反!、自增++、自减--
- 二元运算符:需要两个数据才可以进行操作的运算符。例如:加法+、赋值=
- 三元运算符:需要三个数据才可以进行操作的运算符。
一个条件后面会跟一个问号(?),如果条件为truthy ,则问号后面的表达式A将会执行;
表达式A后面跟着一个冒号(:),如果条件为falsy ,则冒号后面的表达式B将会执行。
fun max(a: Int, b: Int) = if (a > b) a else b
//if是这里的一个表达式:它返回一个值
println(max(99, -42)) //99
使用Java的三元运算符,与其对比
int a = 99;
int b = 42;
// 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
// 判断a > b是否成立,如果成立将a的值赋值给max;如果不成立将b的值赋值给max。二者选其一
int max = a > b ? a : b; // 最大值的变量
System.out.println("最大值:" + max); // 99
2、when语句
fun main() {
println(whenAssign("Hello"))
println(whenAssign(3.4))
println(whenAssign(1))
println(whenAssign(MyClass()))
}
fun whenAssign(obj: Any): Any {
val result = when (obj) { // 1
1 -> "one" // 2
"Hello" -> 1 // 3
is Long -> false // 4
else -> 42 // 5
}
return result
}
class MyClass
- 这是一个表达式。
when
- 将值设置为 if 等于 1。
"one"
- 将值设置为 if等于
Hello。
1。 - 将值设置为 if 是
Long
的实例。false
- 如果上述任何条件均不满足,则设置值“42”。 与语句不同,表达式中通常需要默认分支,除非编译器可以检查其他分支是否涵盖所有可能的情况。
3、循环语句
3.1 for语句
for
在 Kotlin 中的工作方式与在大多数语言中相同。
fun main(args: Array<String>) {
val cakes = listOf("carrot", "cheese", "chocolate")
for (cake in cakes) { //遍历cakes
println("Yummy, it's a $cake cake!")
}
}
//Yummy, it's a carrot cake!
//Yummy, it's a cheese cake!
//Yummy, it's a chocolate cake!
3.2 while / do...while语句
while
结构和do-while
结构的工作方式与大多数语言类似。
fun eatACake() = println("Eat a Cake")
fun bakeACake() = println("Bake a Cake")
fun main(args: Array<String>) {
var cakesEaten = 0
var cakesBaked = 0
while (cakesEaten < 5) { // 在条件为 true 时执行块。
eatACake()
cakesEaten ++
}
do { // 首先执行块,然后检查条件
bakeACake()
cakesBaked++
} while (cakesBaked < cakesEaten)
}
//Eat a Cake
//Eat a Cake
//Eat a Cake
//Eat a Cake
//Eat a Cake 5次
//Bake a Cake
//Bake a Cake
//Bake a Cake
//Bake a Cake
//Bake a Cake
//Bake a Cake 6次
3.3 迭代器
通过在类中实现运算符,可以在类中定义自己的迭代器。iterator
class Animal(val name: String)
class Zoo(val animals: List<Animal>) {
operator fun iterator(): Iterator<Animal> { // 1
return animals.iterator() // 2
}
}
fun main() {
val zoo = Zoo(listOf(Animal("zebra"), Animal("lion")))
for (animal in zoo) { // 3
println("Watch out, it's a ${animal.name}")
}
}
//Watch out, it's a zebra
//Watch out, it's a lion
- 定义类中的迭代器
iterator
。它必须被命名并具有修饰符operator
- 返回满足以下方法要求的迭代器:
next()
:Animal
会返回迭代器的下一个元素,并且更新迭代器的状态hasNext()
:Boolean
用于检测集合中是否还有元素
- 使用用户定义的迭代器 循环遍历 zoo中的animal。
4、定义范围
4.1 循环访问
增量为1
for(i in 0..3) {
print(i)
}
print(" ") //0123
//像C/C++/Java中的'for(i=0; i<=3; ++i)'一样
迭代
//像C/C++/Java中的'for(i=0; i<3; ++i)'
for(i in 0 until 3) {
print(i)
}
print(" ")
//012
支持字符char范围
//字母顺序循环访问 char 范围
for (c in 'a'..'d') {
print(c)
}
print(" ")
//abcd
自定义增量
//增量为2
for(i in 2..8 step 2) {
print(i)
}
print(" ")
//2468
反顺序访问
for (i in 3 downTo 0) {
print(i)
}
print(" ")
//3210
//反序,且增量为2
for (c in 'z' downTo 's' step 2) {
print(c)
}
print(" ")
//zxvt
4.2 检查值是否在范围内
val x = 2
if (x in 1..5) {
print("x is in range from 1 to 5")
}
println()
//2 is in range from 1 to 5
if (x !in 6..10) {
print("x is not in range from 6 to 10")
}
//2 is not in range from 6 to 10
5、等式检查
== :等于,用于结构比较
=== :全等于
val authors = setOf("Shakespeare", "Hemingway", "Twain")
val writers = setOf("Twain", "Shakespeare", "Hemingway")
println(authors == writers)
// 调用并设置忽略元素顺序 true
//authors. equals (writers)
println(authors === writers)
// false
//authors不全等于writers