// 不好的写法var user: Userfor (i in users.indices) { user = users[i]print("User at $i is $user")}// 好的写法for (i in users.indices) {val user = users[i]print("User at $i is $user")}// 相同变量作用域下,更好的语法使用for ((i, user) in users.withIndex()) {print("User at $i is $user")}
在第一个示例中,user 变量不仅可以在 for 循环的范围内访问,也可以在 for 循环之外访问。在第二个和第三个示例中,我们将 user 变量的作用域具体限制在 for 循环的作用域内。
// 不好的写法
val user: User
if (hasValue) {
user = getValue()
} else {
user = User("bbb")
}
// 好的写法
val user: User = if (hasValue) {
getValue()
} else {
User("bbb")
}
// 不好的写法
fun updateWeather(degrees: Int) {
val description: String
val color: Color
if (degrees < 5) {
description = "cold"
color = Color.BLUE
} else if (degrees < 23) {
description = "mid"
color = Color.YELLOW
} else {
description = "hot"
color = Color.RED
}
}
// 好的写法
fun updateWeather(degrees: Int) {
val (description, color) = when {
degrees < 5 -> "cold" to Color.BLUE
degrees < 23 -> "mid" to Color.YELLOW
else -> "hot" to Color.RED
}
}
var numbers = (2..100).toList()
val primes = mutableListOf<Int>()
while (numbers.isNotEmpty()) {
val prime = numbers.first()
primes.add(prime)
numbers = numbers.filter { it % prime != 0 }
}
print(primes) // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
// 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
val primes: Sequence<Int> = sequence {
var numbers = generateSequence(2) { it + 1 }
var prime: Int
while (true) {
prime = numbers.first()
yield(prime)
numbers = numbers
.drop(1)
.filter { it % prime != 0 }
}
}
print(primes.take(10).toList())
// [2, 3, 5, 6, 7, 8, 9, 10, 11, 12]