疯狂kotlin讲义连载之运算符和表达式——区间运算符

470 阅读3分钟

3.3 区间运算符

Kotlin提供了两个区间运算符,它们都可以非常方便地构建一种数据结构,这种数据结构可包含特定区间内的所有值。

3.3.1闭区间运算符

闭区间运算符a .. b用于定义一个从a~b(包括ab边界值)的所有值的区间,对于闭区间运算符而言,a不能大于b,否则程序运行时将会报错。

Kotlinfor-in循环可用于遍历区间内的所有数据。例如如下代码。

程序清单:codes\03\3.3\RangeTest.kt

fun main(args: Array<String>) {

//使用闭区间运算符定义区间

var range1 = 2 .. 6

for( num in range1 ) {

println("${num} * 5 = ${num * 5}")

}

}

上面粗体字代码构建了一个区间,该区间包含2~6的所有数值,包括234565个值。

3.3.2 半开区间运算符

半开区间运算符a until b用于定义一个从a~b(包括a边界值,但不包含b边界值)的所有值的区间,半开区间运算符与闭区间运算符类似,a也不能大于b

如果a until b中边界a与边界b的值相等,就会产生一个空区间,该区间不包含任何值;如果a .. b中边界a与边界b的值相等,就会产生一个只包含一个值的区间,该区间只包含一个边界值。

利用半开区间遍历数组等列表(数组元素的索引是0到长度减1)时非常方便,例如如下程序(程序清单同上)://定义数组

val books = arrayOf("Swift" , "Kotlin" , "C" , "C++")

//使用半开区间运算符定义区间

for ( index in 0 until books.size) {

println("${index+1}种语言是:${books[index]}")

}

上面程序构建了0 until books.size的区间,其中books.size返回数组元素的个数,也就是4,而且此处使用的是半开区间,因此该区间代表0123等数值。

3.3.3 反向区间

如果程序希望区间可以从大到小,则可使用downTo运算符(其实是一个infix函数),该函数同样构建一个闭区间。对于a downTo b而言,此时要求b不能大于a

例如如下程序使用downTo定义了反向区间。

程序清单:codes\03\3.3\DownToTest.kt

fun main(args: Array<String>) {

//使用反向闭区间运算符定义区间

var range1 = 6 downTo 2

for( num in range1 ) {

println("${num} * 5 = ${num * 5}")

}

}

上面程序使用downTo定义的区间将会从6逆序降到2,上面程序的输出结果如下所示。

6 * 5 = 30

5 * 5 = 25

4 * 5 = 20

3 * 5 = 15

2 * 5 = 10

3.3.3 区间步长

前面我们见到的所有区间的默认步长都是1,也就是区间内两个值之间的差值是1。而通过step
运算符(其实是一个infix函数)可以显式指定区间的步长。例如如下程序(程序清单同上)。

//为反向闭区间指定步长

for( num in 7 downTo 1 step 2 ) {

println("${num} * 5 = ${num * 5}")

}

上面程序使用downTo定义的区间将会从7逆序降到1,且步长为2,上面程序的输出结果如下所示。

7 * 5 = 35

5 * 5 = 25

3 * 5 = 15

1 * 5 = 5

以上内容节选自《疯狂Kotlin讲义》:一本让您最直接认识Kotlin的疯狂讲义


本书即将于2017年11月发售 敬请期待

往期连载