在groovy中迭代数组中的范围和索引

时间:2016-03-02 12:41:20

标签: groovy

随着更多使用groovy,我觉得写for(){}循环有点不合适。几乎总是我避免使用Java for(){}循环并进行groovy each{}循环。但是有一种情况我无法避免for(){}

在我们的项目中,我们不会将迭代器返回到某个类的成员列表。我们返回列表的大小然后得到(索引)方法,如下面的摘录:

class ClassWithList
{
    private def tempList = ["a","b","c"]

    public int getNumberOfItems()
    {
        return 3;
    }

    public String getItem(int pIndex)
    {
    return tempList[pIndex];
    }
}

调用类首先调用getNumberOfItems(),然后使用getItem()迭代列表:

ClassWithList obj = new ClassWithList();
for(int i=0;i<obj.getNumberOfItems();i++)
    println obj.getItem(i)

使用each{},采用以下格式:

ClassWithList obj = new ClassWithList();
(0..obj.getNumberOfItems()-1).each {
    println obj.getItem(it)
}

当列表中没有元素时会出现问题,在这种情况下,范围将为(0..-1)。当尝试读取负索引为ArrayIndexOutOfBoundsException的项目时,它会向下计数并导致-1。例如,下面的代码会导致ArrayIndexOutOfBoundsException

class AdHocTests {
    public static main(def args)
    {   
        ClassWithList obj = new ClassWithList();
        (0..obj.getNumberOfItems()-1).each {
            println obj.getItem(it)
        }
    }   
}

class ClassWithList
{
    private def tempList = []

    public int getNumberOfItems()
    {
        return 0;
    }

    public String getItem(int pIndex)
    {
    return tempList[pIndex];
    }
}

在这种情况下,如何让(0..x).each{}()x=0合作?或者没有出路,我应该坚持传统for(){}。 groovy能提供惊喜吗?

2 个答案:

答案 0 :(得分:2)

根据the documentation,您可以使用半开范围:

(0..<obj.getNumberOfItems()).each {
    println obj.getItem(it)
}

答案 1 :(得分:0)

首先,在Groovy中,您不需要指定私有属性,因为它是默认生成的。此外,默认情况下也会创建getter和setter,因此您只需要调用它们。

如果我理解了你的问题,你只想在列表中进行迭代。

清洁课程将是:

class ClassWithList {

List tempList = ["a","b","c"]

}

//为了迭代列表,您只需要每个方法:

ClassWithList obj = new ClassWithList()  //; Not necessary in groovy!!
(obj.tempList).each { def element ->
    println element
}

答案是:[a,b,c]

希望能帮到你