Kotlin 8. Kotlin Control Flow: When, For, While, Range 等使用

一起来学Kotlin:概念:8. Kotlin Control Flow: When, For, While, Range 等使用

这里,我们将逐一介绍 When, For, ForEach, While, Do-While, Range: .. 等使用。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


1 When

Kotlin中,when 代替了广泛使用的 switch 语句,在构造时提供了更加灵活和清晰的方式。 它既可以用作语句,也可以用作表达式。

fun main() {
    cases("Hello")
    cases(1)
    cases(0L)
    cases(MyClass())
    cases("hello")
}

fun cases(obj: Any) {                                
    when (obj) {                                       
        1 -> println("One")                          
        "Hello" -> println("Greeting")               
        is Long -> println("Long")                   
        !is String -> println("Not a string")        
        else -> println("Unknown")                   
    }   
}

class MyClass

需要注意的是,when 中的所有语句会逐条遍历,直到某一项得到满足。

以下是另一个 when 使用的例子:

fun main() {
    println(whenAssign("Hello"))        // 打印 1
    println(whenAssign(3.4))            // 打印 42
    println(whenAssign(1))              // 打印 one
    println(whenAssign(MyClass()))      // 打印 42
}

fun whenAssign(obj: Any): Any {
    val result = when (obj) {                   
        1 -> "one"                              
        "Hello" -> 1                            
        is Long -> false                        
        else -> 42                              
    }
    return result
}

class MyClass

2 For, ForEach

在这里,我们可以对 For Loop 和 ForEach Loop 进行一些介绍和比较:

// For loop
for (i in 0..10) { println(i) }
// ForEach
(0..10).forEach { println(it) }

上述两个表达方式是等效的。

如果数据源是一个可迭代的集合,那么 forEach 会更好,因为它可以链接在一起。

// For loop
val list = listOf(1, 2, 3).filter( it == 2 )
for (i in list) { println(i) }
// ForEach
listOf(1, 2, 3).filter( it == 2 ).forEach { println(it) }

对于 continue 和 break 来说,For 可能是更加适合的选择。

// For loop
for (i in 0 until 10 step 3) {
    if (i == 6) continue
    println(i)
}
// ForEach
(i in 0 until 10 step 3).forEach {
    if (it == 6) return@forEach
    println(it)
}
// For loop
for (i in 0 until 10 step 3) {
    if (i == 6) break
    println(i)
}
// ForEach (result is wrong though)
(i in 0 until 10 step 3).forEach {
    if (it == 6) return
    println(it)
}

我们可以在 For 循环中使用 break,但对于 forEach,它可以尝试的最接近的是 return,这并不正确,因为它将完全退出其包含的函数,而不是在 for 循环之外继续。所以,如果遇到 break 和 continue 的情况,For是最好的选择。

如果我们希望 For 循环中带有 index,可以这么写:

for (i in array.indices) {
    print(array[i])
}

或者

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

对于 ForEach 来说,等价的表述方式是:

collection.forEachIndexed { index, element ->
    // ...
}

3 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) {                    
        eatACake()
        cakesEaten ++
    }
    
    do {                                        
        bakeACake()
        cakesBaked++
    } while (cakesBaked < cakesEaten)

}

返回:

Eat a Cake
Eat a Cake
Eat a Cake
Eat a Cake
Eat a Cake
Bake a Cake
Bake a Cake
Bake a Cake
Bake a Cake
Bake a Cake

While 和 Do-while 和其他语言没什么区别,这里就不详细介绍了。

4 Iterator 运算符

我们可以通过在类中实现迭代器运算符来在类中定义自己的迭代器。

class Animal(val name: String)

class Zoo(val animals: List<Animal>) {

    operator fun iterator(): Iterator<Animal> {             
        // 在类中定义一个迭代器。 它必须被命名为迭代器并具有操作符修饰符。
        return animals.iterator()                           
        // 返回满足以下方法要求的迭代器:- next(): Animal; - hasNext(): Boolean
    }
}

fun main() {

    val zoo = Zoo(listOf(Animal("zebra"), Animal("lion")))

    // 使用用户定义的迭代器循环遍历
    for (animal in zoo) {                                   
        println("Watch out, it's a ${animal.name}")
    }

}

5 Ranges “…” 的使用

// 数字的使用
for(i in 0..3) {             
    print(i)
}
// 从 0 到 3(包含3)的迭代。就像其他编程语言 (C/C++/Java) 中的 'for(i=0; i<=3; ++i)'。
print(" ")

for(i in 0 until 3) {       
    print(i)
}
// 从 0 到 3(不包含3)的迭代。
print(" ")

for(i in 2..8 step 2) {    
    print(i)
}
print(" ")

for (i in 3 downTo 0) {    
    print(i)
}
print(" ")
// 上述打印结果显示:0123 012 2468 3210 

// char的使用
for (c in 'a'..'d') {        // 1
    print(c)
}
print(" ")

for (c in 'z' downTo 's' step 2) { // 2
    print(c)
}
print(" ")
// 上述打印结果显示:abcd zxvt 

// 和if放在一起使用
val x = 2
if (x in 1..5) {            // 1
    print("x is in range from 1 to 5")
}
println()

if (x !in 6..10) {          // 2
    print("x is not in range from 6 to 10")
}

6 Equality Checks

Kotlin 使用 == 进行结构比较,使用 === 进行引用比较。

val authors = setOf("Shakespeare", "Hemingway", "Twain")
val writers = setOf("Twain", "Shakespeare", "Hemingway")

println(authors == writers)   // Returns true because it calls authors.equals(writers) and sets ignore element order.
println(authors === writers)  // Returns false because authors and writers are distinct references.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破浪会有时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值