2016-02-08 3 views
1

Я пытаюсь выполнить простейшую операцию в Xtend, но не знаю, как это сделать. Я хочу добавить значение double в массив double[] внутри цикла for.Xtend: добавить элемент в массив в for-loop

Например:

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? Не нашли ничего в руководстве пользователя.

ответ

2

Xtend имеет другую («список подобных») синтаксис для доступа к элементам массива, см related documentation подробности:

Получение и установка значений массивов осуществляется с помощью расширения методы получения (INT) и set (int, T), которые специально перегружены для массивов и переводятся непосредственно на эквивалентный собственный Java-код 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 распространяется/инвентарем List), то можно было бы просто написать:

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

В этом случае вы должны явно объявить тип возвращаемого значения, как double[], потому что в противном случае было бы сделать вывод, как List<Double>.

(Просто еще одна вещь:. Обычно коллекции предпочтительнее массивов, потому что они являются более гибкими и имеют более богатые API-интерфейсы, и Xtend имеет некоторые дополнительные вкусности, а как collection literals)

+0

Большое спасибо Snorbi, это помогло меня много! – John