2017-02-25 186 views
0

源作爲數據科學家,我經常使用的數據提取如下形式的優雅遍歷(即DB,文件閱讀等功能):在斯卡拉

val source = open(sourceName) 
var item = source.getNextItem() 
while(item != null){ 
    processItem(item) 
    item = source.getNextItem() 
} 
source.close 

我(目前)的夢想是包裝這個冗長到斯卡拉對象「SourceTrav」,將允許這個優雅:

SourceTrav(sourceName).foreach(item => processItem(item)) 

具有相同的功能之上,但沒有運行到的StackOverflowError,就象在Semantics of Scala Traversable, Iterable, Sequence, Stream and View?

與實例發生

有什麼想法?

回答

0

如果Scala的標準庫(例如scala.io.Source)不適合您的需求,則可以使用不同的IteratorStream伴隨對象方法來包裝手動迭代器遍歷。

在這種情況下,例如,你可以做到以下幾點,當你已經有一個開源:

Iterator.continually(source.getNextItem()).takeWhile(_ != null).foreach(processItem) 

如果你也想加入自動開啓和源關閉,不要忘記添加try - finallyloan模式一番風味:

case class SourceTrav(sourceName: String) { 
    def foreach(processItem: Item => Unit): Unit = { 
    val source = open(sourceName) 
    try { 
     Iterator.continually(source.getNextItem()).takeWhile(_ != null).foreach(processItem) 
    } finally { 
     source.close() 
    } 
    } 
} 
+0

就像一個魅力!謝謝你的迅速回應。 – EliG