XTend For-Loop支持和添加范围支持

时间:2012-08-26 01:28:43

标签: for-loop foreach xtend

我似乎找不到一种在Xtend中表达以下内容的好方法,而不需要使用while循环:

for(int i = 0; i < 3; i++){
    println("row ");
}
println("your boat");

所以,我想我的问题有两部分:

  • 有没有更好的方法来做到这一点?我在documenation
  • 中没有看到任何有希望的东西
  • 该语言的很大一部分功能只是Xtend库扩展(它们很棒!)。我不知道Python有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
}
}

6 个答案:

答案 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