Groovy 维护列表内容

列表4.8展现了第一组方法,涉及到了向列表中增加元素、从列表中删除元素;通过不同的途径组合列表,排序,翻转列表和平整(flattening)嵌套的列表,从存在的列表创建新的列表。

列表中的元素可以是任何类型,包括别的嵌套的list对象,这可以用来实现列表的列表,在groovy中这与java中的多维数组相等价,对于嵌套的list来说,通过flatten方法来获取到一个包括所有元素的列表。

对于同时出现在两个列表中的元素的交集,集合也可以通过方法disjoint方法来获取到交集,不管它们的交集是否为空。

List可以像堆栈(stack)那样使用,常用的堆栈行为是push和pop,如(1)所示,push操作使用list的“<<”操作符替代。

当list中的元素是可比较的(实现Comparable接口),那么可以对list直接进行排序,也可以通过一个闭包指定一个排序逻辑,如(2)和(3)所示,在(2)中,通过子列表的第一个元素进行排序,在(3)中接受单个参数,这样能在闭包内部完成排序,在这个例子中,排序根据闭包的返回结果进行(返回的结果必须是可比较的(Comparable))。

可以通过索引删除元素,如(4)所示,或者通过值删除元素,如(5)所示,也可以删除这个列表中所有的在另外一个list中出现的元素。在JDK中包括所有的删除方法。

Collect方法,如(6)所示,返回一个新的list,这个list中的每个元素是原list相同位置的元素应用闭包的结果。在例子中,在接受的新的list中,每一个元素的值都为 原list中的相应元素*2。findAll方法,如(7)所示,这个方法返回的列表中的所有条目是原list根据闭包计算结果为true的元素,在这个例子中,我们使用模运算符来查找所有的奇数。

改变存在的列表的两个相关的问题是删除重复值和删除null值,删除重复值的一种方法是将list转换为一个Set,使用list作为参数通过调用Set的构造方法来完成。def x = [1,1,1] assert [1] == new HashSet(x).toList() assert [1] == x.unique()如果不想创建新的集合但还是想完成相同的工作,可以使用unique方法,这保证实体的顺序没有被这个操作改变。

从list中删除null值能保证列表中没有空元素——例如,在前面已经看到的findAll方法:def x = [1,null,1] assert [1,1] == x.findAll{it != null} assert [1,1] == x.grep{it}可以看到通过grep代码更简短,但是为了更好的理解这种机制,读者需要闭包的相关知识。