随着更多使用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能提供惊喜吗?
答案 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]
希望能帮到你