Xtend:在for循环中将元素添加到数组

Xtend: Add element to array in for-loop

我正在尝试在 Xtend 中进行最简单的操作,但不知道如何操作。我想将 double 值添加到 for 循环内的 double[] 数组。

例如:

def do(EList<MyObject> list) {
    var double[] array = newDoubleArrayOfSize(list.size);
    for (i : 0 ..< list.size) {
        array[i] = list.get(i).myValue;
    }
    return array;
}

第四行显示错误,因为我不能使用array[i] = ...

我如何在 Xtend 中实现它?在用户指南中未找到任何内容。

Xtend 有不同的 ("list-like") 访问数组元素的语法,详情请参阅 related documentation

Retrieving and setting values of arrays is done through the extension methods get(int) and set(int, T) which are specifically overloaded for arrays and are translated directly to the equivalent native Java code myArray[int].

所以你的代码应该是:

def method(EList<MyObject> list) {
    var double[] array = newDoubleArrayOfSize(list.size);
    for (i : 0 ..< list.size) {
        array.set(i, list.get(i).myValue);
    }
    return array;
}

您可以通过省略分号和 array 变量的类型声明来进一步简化您的方法:

def method(EList<MyObject> list) {
    val array = newDoubleArrayOfSize(list.size)
    for (i : 0 ..< list.size) {
        array.set(i, list.get(i).myValue)
    }
    return array
}

另一种选择是以更 功能性 的风格编写您的方法。如果您可以将 EList 替换为 List(或 EList extends/implements List),那么您可以简单地写:

def double[] method(List<MyObject> list) {
    list.map[myValue]
}

在这种情况下,您必须将 return 类型显式声明为 double[],否则它将被推断为 List<Double>.

(还有一件事:通常集合比数组更受欢迎,因为它们更灵活并且具有更丰富的 API,并且 Xtend 也有一些额外的好东西,比如 collection literals。)