// Checking if value of comparable is in range. Optimized for nu
mber primitives.
if
(i
in
1..10
) println(i)
if
(x
in
1.0
.
.3.0
) println(x)
if
(str
in
"island"
..
"isle"
) println(str)
// Iterating over arithmetical progression of numbers. Optimized
for number primitives (as indexed for-loop in Java).
for
(i
in
1..4
) print(i)
// prints "1234"
for
(i
in
4..1
) print(i)
// prints nothing
for
(i
in
4
downTo
1
) print(i)
// prints "4321"
for
(i
in
1..4
step
2
) print(i)
// prints "13"
for
(i
in
(
1..4
).reversed()) print(i)
// prints "4321"
for
(i
in
(
1..4
).reversed() step
2
) print(i)
// prints "42"
for
(i
in
4
downTo
1
step
2
) print(i)
// prints "42"
for
(x
in
1.0
.
.2.0
) print(
"$x "
)
// prints "1.0 2.0 "
for
(x
in
1.0
.
.2.0
step
0.3
) print(
"$x "
)
// prints "1.0 1.3 1.6
1.9 "
for
(x
in
2.0
downTo
1.0
step
0.3
) print(
"$x "
)
// prints "2.0 1
.7 1.4 1.1 "
for
(str
in
"island"
..
"isle"
) println(str)
// error: string
常见的接口的定义
有俩种基本接口:
Range Progression
136
Ranges
Range
接口定义了一个范围,或者是数学意义上的一个间隔。
interface Range<T : Comparable<T>> {
val
start
: T
val
end
: T
fun
contains
(Element : T)
:
Boolean
}
Progression
定义了数学上的级数。包括
start end increment
端点。最大的特点
就是它可以迭代,因此它是
Iterable
的子类。
end
不是必须的。
interface Progression<N : Number> : Iterable<N> {
val
start
: N
val
end
: N
val
increment
: Number
}
与
java
的
for
循环类似:
// if increment > 0
for
(int i = start; i <= end; i += increment) {
// ...
}
// if increment < 0
for (int i = start; i >= end; i += increment) {
// ...
}
类的实现
为避免不需要的重复,让我们先考虑一个数字类型
Int
。其它的数字类型也一
样。注意这些类的实例需要用相应的构造函数来创建,使用
rangeTo() downTo()
reversed() stop()
实用函数。
IntProgression
类很直接也很简单:
137
Ranges
class
IntProgression
(
override val
start
:
Int
,
override val
end
:
Int
,
override val
increment
:
Int
): Progression<Int> {
override fun
iterator
()
: Iterator<Int> =
IntProgressionItera
torImpl
(start, end, increment)
}
IntRange
有些狡猾:它实现了
Progression<Int> Range<Int>
接口,因
为它天生以通过
range
迭代
(
默认增加值是
1 )
:
class
IntRange
(
override val
start
:
Int
,
override val
end
:
Int
):
Range<Int>, Progression<Int> {
override val
increment
:
Int
get
() =
1
override fun
contains
(element: Int)
:
Boolean
= start <= elemen
t && element <= end
override fun iterator(): Iterator<Int> =
IntProgressionIterato
rImpl
(start, end, increment)
}
ComparableRange
也很简单:
class
ComparableRange
<T : Comparable<T>>(
override val
start
: T,
override val
end
: T): Range<T> {
override fun
contains
(element: T)
:
Boolean
= start <= element
&& element <= end
}