我似乎找不到一种在Xtend中表达以下内容的好方法,而不需要使用while循环:
for(int i = 0; i < 3; i++){
println("row ");
}
println("your boat");
所以,我想我的问题有两部分:
range()
功能吗? 我最终滚动自己,得到了类似下面的内容:
class LanguageUtil {
def static Iterable<Integer> range(int stop) {
range(0, stop)
}
def static Iterable<Integer> range(int start, int stop) {
new RangeIterable(start, stop, 1)
}
def static Iterable<Integer> range(int start, int stop, int step) {
new RangeIterable(start, stop, step)
}
}
// implements Iterator and Iterable which is bad form.
class RangeIterable implements Iterator<Integer>, Iterable<Integer> {
val int start
val int stop
val int step
var int current
new(int start, int stop, int step) {
this.start = start;
this.stop = stop;
this.step = step
this.current = start
}
override hasNext() {
current < stop
}
override next() {
val ret = current
current = current + step
ret
}
override remove() {
throw new UnsupportedOperationException("Auto-generated function stub")
}
/**
* This is bad form. We could return a
* new RangeIterable here, but that seems worse.
*/
override iterator() {
this
}
}
答案 0 :(得分:16)
的确切替代品
for(int i = 0; i < 3; i++){
println("row ");
}
是
for (i : 0 ..< 3) {
println("row ")
}
请注意独占范围运算符:..<
答案 1 :(得分:14)
你也可以用
更具惯用性(1..3).forEach[println("row")]
对于Xtend来说很新,但男人却在jvm上编程很棒。
答案 2 :(得分:5)
对我来说,基于范围的forEach
意味着范围在某种程度上是有意义的。为了在没有迭代变量的情况下循环特定次数,我发现Ruby的times
循环更清楚地表达了意图:
3.times [|println("row")]
可悲的是,它不是IntegerExtensions
的一部分,但是实施是微不足道的:
def static times(int iterations, Runnable runnable) {
if (iterations < 0) throw new IllegalArgumentException(
'''Can't iterate negative («iterations») times.''')
for (i: 0 ..< iterations) runnable.run()
}
答案 3 :(得分:4)
for(i: 1..3) {
println("row ")
}
答案 4 :(得分:3)
从Xtend 2.6开始,我们也支持“传统”for循环,就像在Java中一样。
答案 5 :(得分:3)
实际上有forEach()
的版本接受带有两个参数的lambda。
如果您需要在循环中访问迭代索引,这将非常有用。
(10..12).forEach[ x, i | println('''element=«x» index=«i»''')]
打印:
element=10 index=0
element=11 index=1
element=12 index=2