Groovy .collect与元素数限制

时间:2011-11-21 18:13:28

标签: java grails groovy

有没有办法使用groovy .collect方法,但只能使用源数组中的某个索引?

例如,如果您的源迭代器长度为100万且您的限制为100,则最终会得到100个项目的数组。

3 个答案:

答案 0 :(得分:20)

从Groovy 1.8.1开始,您也可以

list.take(100).collect { ... }

其中take将返回列表中的前100个元素。

答案 1 :(得分:3)

如果您使用的是实现java.util.List的任何数据结构,则可以对其执行collection.subList(0, 100)。其中0是起始索引,100是结束。之后,您将新集合传递到collect()

以下是使用扩展java.util.Iterator的对象的示例:

public class LimitIterator implements Iterator, Iterable {
   private it
   private limit
   private count

   LimitIterator(Iterator it, int limit) {
      limit = limit;
      count = 0;
      it = it
   }

   boolean hasNext(){
      return (count >= limit) ? false : it.hasNext()
   }

   Object next() {
      if (!hasNext()) throw new java.util.NoSuchElementException()

      count++
      return it.next()
   }

   Iterator iterator(){
      return this;
   }

   void remove(){
      throw new UnsupportedOperationException("remove() not supported")
   }

}

// Create a range from 1 to 10000
// and an empty list.
def list = 1..10000
def shortList = []

// Ensure that everything is as expected
assert list instanceof java.util.List
assert list.iterator() instanceof java.util.Iterator
assert list.size() == 10000
assert shortList instanceof java.util.List

// Grab the first 100 elements out of the lists iterator object.
for (i in new LimitIterator(list.iterator(), 100)) {
    shortlist.add(i);
}
assert shortlist.size() == 100

答案 2 :(得分:3)

您可以使用一系列索引来获取子列表,然后将collect应用于子列表。

def result = list[0..100].collect { ... }