# Groovy 使用 list 操作符

**URL:** <https://www.isharkfly.com/t/groovy-list/6942>\
**Category:** 程序语言\
**Created:** [November 27, 2012, 4:36am UTC](https://www.isharkfly.com/t/groovy-list/6942 "2012-11-27T04:36:41Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [November 27, 2012, 4:36am UTC](https://www.isharkfly.com/t/groovy-list/6942/1 "2012-11-27T04:36:41Z")

</div>

List实现了在3.3节列出的一些操作符，列表4.4是其中的两个：getAt和putAt方法，这两个方法用来实现下标操作符，这样可以简单的通过索引来访问list，这样比通过其他方式访问list更加变利。

下标操作符

GDK使用range和collection作为参数重载了getAt方法，这样可以通过一个范围或者索引的一个集合来访问，在列表4.5进行了说明。

同样的策略应用到了putAt方法上，这个方法使用一个Range作为参数的方式进行了重载，这样可以将一个列表值指定给整个子列表。

 ![](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/7/77e207ffca03232add03a8114c13fb0249e8b96e.png)

通过范围指定下标的数量不需要与range的数量一样，当指定的列表值小于给定的范围或者是空的时候，这个列表被收缩，如（1）显示的那样，当指定的列表值更大时，列表进行增长，如（2）所示。

范围作为下标使用来访问list中的元素是十分便利的特性，也可以参考javadoc java.util.List#sublist。

除了正数作为下标索引之外，list也可以通过负数进行索引，通过负数索引是从列表的最后向前走的。图4.1显示了list[0,1,2,3,4]进行正数索引和负数索引的对照。

因此，通过list[-1]来获取非空列表的最后一个元素，通过list[-2]来获取到倒数第二个元素，负数索引也可以用作表示范围，因此list[-3..-1]这样的表示结果将得到列表的最后三个元素。

当使用反向范围的时候，得到的结果列表也是反向的，因此 list[4..0]的结果是[4,3,2,1,0]。

在这里，结果作为一个新的list对象返回，而不是 像JDK的sublist那样返回原来的对象，甚至混合使用正数和负数作为索引都是可以的，如 list[1..-2]能够用来去掉原来列表的开始的和最后的元素。

![](https://www.isharkfly.com/images/transparent.png)

图4.1 一个长度为5的列表的正数和负数索引，包括在界内和在界外的分类索引

提示：list下标操作符中的range是IntRange的实例，排他性的IntRange在构建的时候被映射，这发生在下标操作符起作用和能隐射负数索引和到正数索引之前，这在混合正的左边界和负的右边界（不包括）会使人十分惊奇的，例如，IntRange(0..\<2)得到的结果是(0..-1)，因此list[0..\<2]实际上等同于list[0..-1]。

虽然这样没有问题并且是可以预见的工作，但对于代码的阅读者也许会感到迷惑，读者也许预料的结果为list[0..-3]，基于这个原因，这种方式应该避免使用。

增加和删除列表中的条目

虽然下标操作符能用来改变一个列表中的任意单个元素，也有一些操作符用来改变 list的内容，它们是 plus(Object),plus(Collection),leftShift(Object),minus(Collection) 和multiply，列表4.6显示了它们的用法，plus方法被重载，这样可以区别是增加一个元素还是增加一个集合的所有元素到列表中，minus方法仅仅接受一个集合作为参数。

 ![](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/3/303702d05d6503ac202bb100237a1c1ce7500c65.png)

当谈论操作符的时候，并不只是已经在列表上使用过的“==”操作符，幸好这正是我们期望的，来看看它是如何工作的：列表的equals方法用来测试两个集合是否有相同的元素，参考javadoc文档java.util.List#equals了解更详细的信息。
