2012-02-22 24 views

回答

2

Java中沒有yield return語句。最好的方式(這不是說一種超級簡單的方式)做你想做的就是編寫你自己的實現Iterator

class LazyIterator implements Iterator<Foo> { 
    private Iterator<Foo> backingIterator = null; //set this later 

    private void lazyLoad() { 
     if (backingIterator != null) { 
      return; 
     } 
     //load the backing collection and assign to backingIterator here 
    } 

    @Override 
    public boolean hasNext() { 
     lazyLoad(); 
     return backingIterator.hasNext(); 
    } 

    @Override 
    public Foo next() { 
     lazyLoad(); 
     return backingIterator.next(); 
    } 

    @Override 
    public void remove() { 
     lazyLoad(); 
     backingIterator.remove(); 
    } 
} 

正如你所看到的,這是一個全有或全無的懶加載程序。您也可以考慮一個漸進式延遲加載器,只在您收集數據時才加載數據。這種情況下有用的一種情況是集合包含非常多的記錄。

您可能還希望/需要更具體,並編寫一個CollectionList的延遲加載包裝。這種技術是相似的,但通常會做更多的工作(一個懶惰的加載List可能需要一個懶惰的Iterator,並且您可能不得不關心線程安全性,只是想到幾件事情)。

這基本上是通過手工完成c#的yield和yield return關鍵字在編譯時轉換下做的。

相關問題