2011-11-21 3 views

Trả lời

3

Nếu bạn đang sử dụng bất kỳ cấu trúc dữ liệu nào triển khai java.util.List bạn có thể thực hiện collection.subList(0, 100) trên đó. Trong đó 0 là chỉ số bắt đầu và 100 là kết thúc. Sau đó bạn sẽ chuyển bộ sưu tập mới vào collect().

Dưới đây là một ví dụ sử dụng một đối tượng mà kéo dài 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 
+0

Đáng tiếc là nó không phải là một danh sách –

+2

@ Matt có lẽ bạn có thể gọi 'ToList() 'hoặc' như List' để chuyển nó sang một danh sách –

+0

Tôi lo lắng rằng cuối cùng có thể đọc toàn bộ iterator vào bộ nhớ –

3

Bạn có thể sử dụng một loạt các chỉ số để có được một sublist, và sau đó áp dụng collect đến sublist.

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

Kể từ Groovy 1.8.1 bạn cũng có thể làm

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

nơi lấy sẽ trả lại 100 yếu tố đầu tiên trong danh sách.

+0

Có * mất * lười biếng như trong Clojure, hoặc nghiêm ngặt? –

+1

Nếu không có đọc mã tôi đoán là có (...) là nghiêm ngặt. Lười biếng rất tuyệt vời trong một ngôn ngữ như Clojure, nơi các cấu trúc dữ liệu không thay đổi, ít hơn trong Groovy, nơi hầu như tất cả mọi thứ đều có thể thay đổi được. Lười biếng vẫn có thể là tuyệt vời, nhưng không có ý nghĩa như một mặc định. – xlson

+1

Đây là một hoạt động trong danh sách và do đó toàn bộ danh sách sẽ có trong bộ nhớ vì vậy nó sẽ được nghiêm ngặt không lười biếng như trong clojure. –