范围允许您创建顺序值列表。这些可以用作ListRange
扩展 java.util.List
。
用符号定义的范围..
是包容性的(即列表包含 from 和 to 值)。
用符号定义的范围..<
是半开的,它们包括第一个值但不包括最后一个值。
用符号定义的范围<..
也是半开的,它们包括最后一个值但不包括第一个值。
用符号定义的范围<..<
是完全开放的,它们不包括第一个值也不包括最后一个值。
// 包含范围
def range = 5..8
assert range.size() == 4
assert range.get(2) == 7
assert range[2] == 7
assert range instanceof java.util.List
assert range.contains(5)
assert range.contains(8)
// 半开放范围
range = 5..<8
assert range.size() == 3
assert range.get(2) == 7
assert range[2] == 7
assert range instanceof java.util.List
assert range.contains(5)
assert !range.contains(8)
// 在不使用索引的情况下获取范围的端点
range = 1..10
assert range.from == 1
assert range.to == 10
请注意,int 范围是有效实现的,它创建了一个包含 from
和 to
值的轻量级 Java 对象。
范围可用于任何实现 java.lang.Comparable
进行比较的 Java 对象,并且还具有方法next()
和previous()
返回范围中的下一个/上一个项目。例如,您可以创建一系列String
元素:
// an inclusive range
def range = 'a'..'d'
assert range.size() == 4
assert range.get(2) == 'c'
assert range[2] == 'c'
assert range instanceof java.util.List
assert range.contains('a')
assert range.contains('d')
assert !range.contains('e')
您可以使用经典for循环对范围进行迭代:
for (i in 1..10) {
println "Hello ${i}"
}
或者,您可以通过使用方法迭代范围,以更 Groovy 的惯用风格实现each
相同的效果:
(1..10).each { i ->
println "Hello ${i}"
}
范围也可以在switch语句中使用:
switch (years) {
case 1..10: interestRate = 0.076; break;
case 11..25: interestRate = 0.052; break;
default: interestRate = 0.037;
}