groovy之範圍特性

will的猜想發表於2017-11-08

ranges用..表示範圍操作符,用來指定左邊界和右邊界 
ep: (0..10) -> 01234567890

..<操作符指定了半排除範圍,不包含右邊界 
ep:(0..<10) -> 0123456789

range也可以通過顯示方法建立:

def a = new IntRange(0,10)

Range主要方法

range主要有如下方法:

1.contains:是否包含一個元素。
assert (0..10).contains(5) == true
assert(0..<10).contains(10) == false
2.size:集合大小
assert(0..<10).size() == 10
3.each迭代閉包
def str = ''
(9..5).each{element->
    str+=element
}
println(str)  -> "98765"
4. grep獲取指定範圍內的元素
assert [22,33,44,55,66].grep((21..50)) == [22,33,44]
5.在switch case語句中使用
age = 36
switch (age){
    case 10..26:
        rate =0.05;break
    case 27..36:
        rate = 0.06;break
    case 37..46:
        rate =0.07;break
    default:
        throw new IllegalArgumentException()
}
assert rate==0.06

Range實戰

range可以用於任何型別,date型別或者String型別,只要這個型別滿足以下兩個條件: 
1.該型別實現next和previous方法,也就是說,重寫++和–操作符; 
2.該型別實現java.lang.Comparable介面;也就是說實現compareTo方法, 實際上是重寫<=>操作符。

下面的例子中我們用類Weekday表示表示一週中的一天,一個Weekday有一個 
值,這個值在‘sun’到‘sat’之間,本質上,它是0到6之間的一個索引,通過list的 下標來對應每個weekday的名稱。

class Weekday implements Comparable{
     final static DAYS=['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
    private int index=0
    Weekday(String day){
        index = DAYS.indexOf(day)
    }
    Weekday previous(){
        return new Weekday(DAYS[index-1]);
    }
    Weekday next(){
        return new Weekday(DAYS[(index+1)%DAYS.size()]);
    }

    @Override
    int compareTo(Object o) {
        return this.index <=> o.index
    }
    String toString(){
        return DAYS[index]
    }

}
def Monday = new Weekday('Mon')
def Friday = new Weekday('Fri')
def str = ''
for (day in Monday..Friday){
    str+= day.toString()+' '
}
println(str)

相關文章