Заводной взять как переопределить
Методы take и drop были добавлены в объект списка в groovy v 1.8.1 и работают следующим образом:
def list = ['Simple', 'list', 'with', 5, 'items']
assert list.take(2) == ['Simple', 'list']
У меня есть только версия 1.8.0 для меня. Как я могу переопределить свою собственную версию list.take(2), используя Groovy v1.8.0?
Можно ли сделать что-то вроде:
def list = ['Simple', 'list', 'with', 5, 'items']
def limit = 2
assert list['0..'+limit] == ['Simple', 'list']
Когда я пытаюсь это сделать, я получаю исключение.
3 ответа
Решение
Нарезка может достичь той же цели:
def list = ['Simple', 'list', 'with', 5, 'items']
assert list[0..1] == ['Simple', 'list']
В том же ключе, что и в ответе GargantuChet, вы можете нарезать его, но используя эксклюзивный диапазон:
List.metaClass.take { n ->
def len = [n,delegate.size()].min()
delegate[0..<len]
}
assert [1,2,3,4].take(2) == [1,2]
assert [1,2].take(2) == [1,2]
assert [1].take(2) == [1]
assert [].take(2) == []
Вы могли бы сделать это так, как это делает Groovy
public static <T> List<T> take(List<T> self, int num) {
if (self.isEmpty() || num <= 0) {
return createSimilarList(self, 0);
}
if (self.size() <= num) {
List<T> ret = createSimilarList(self, self.size());
ret.addAll(self);
return ret;
}
List<T> ret = createSimilarList(self, num);
ret.addAll(self.subList(0, num));
return ret;
}
метод createSimilarList
можно найти здесь