2013-07-30 84 views
4

我不知道什麼是下面的代碼片斷的效率:效率Source.fromFile

val lst = Source.fromFile(f).getLines.toList 

當發出lst.contains(x)

豈不是f正在重新掃描,或者是它的情況下搜索是否依靠新創建的列表中的f的內存內容?

在此先感謝。

回答

4

搜索依賴於內存中的內容。它只被調用一次toList被調用。

如何更好地從source直接看到。 Source.fromFile返回scala.io.BufferedSourcegetLines返回BufferedLineIterator

這是在BufferedLineIterator中,讀取文件的內容。

override def hasNext = { 
    if (nextLine == null) 
    nextLine = lineReader.readLine 

    nextLine != null 
} 
override def next(): String = { 
    val result = { 
    if (nextLine == null) lineReader.readLine 
    else try nextLine finally nextLine = null 
    } 
    if (result == null) Iterator.empty.next 
    else result 
} 
} 

調用toList使用nexthasNext上面導出列表。所以lst已經包含了文件的所有元素。

lst.contains(x)遍歷列表作爲任何其他列表。

2

一旦使用了toList,它將向您返回不可變列表進行操作。您的文件將不會被重新掃描,您正在執行的操作列表中您有