2013-05-08 36 views
-1

Scala有可能創建一個對象並將其保存在內存中嗎?我希望這個問題不存在。我至少沒有發現任何Scala特定的東西。如何在Scala中保留一個對象在內存中?

問題是,我想讀取某個國家的郵政編碼數據的CSV文件(它不是太大,所以它應該適合內存)並將郵政編碼和相應的城市存儲到一個對象中(例如一個地圖,郵政編碼爲關鍵字,Citi爲值)。稍後我要在此對象中搜索特定的郵政編碼。如果存在?如果這樣做,我也想給出相應的Citi(es)。但是現在我不想在每次調用這個函數時都一次又一次地讀取CSV文件。這就是爲什麼我想將數據保存到內存中的對象。 scala有沒有辦法做到這一點?我如何檢查對象是否已經存在於內存中,或者我是否必須創建它?

有沒有人有暗示我應該找什麼?

+1

是的,它被稱爲*變量*。這樣的機制是幾十年前發明的,根本不是scala特有的;-)只要讀取csv並將數據放入'Map'結構。 – 2013-05-08 14:37:18

+0

是的,我想將內容存儲到一個Map變量:)但是,如果我再次調用該函數,我怎麼知道該變量是否已經存在或沒有?我怎樣才能檢查這個? – bam098 2013-05-08 15:06:56

+1

在scala中,變量存在(根據*聲明*)在編譯時檢查。還有變量*實例化的概念*:變量可能被聲明,但尚未設置。對於引用類型(如Map是)聲明的,但尚未初始化的變量被設置爲* null *(就像在java中一樣),所以如果你想檢查變量foo是否被設置爲*一些有意義的*值,它是通常足以將foo與null進行比較:'foo == null'。不要把它當作冒犯,但是也許你最好採取一些編程課程,甚至可以看一下java書(比如*在java *中思考) - ... – 2013-05-08 15:19:42

回答

1

創建地圖後,它將一直保留在內存中,直到它被垃圾收集爲止。如果沒有對象引用您的映射,則垃圾收集器可能會將其刪除。您可以將引用傳遞到您的程序的周圍,以便它永遠不會被刪除或靜態化。

在Java中,你可以把它作爲一個類的靜態成員 - 並行Scala是把它放在一個單獨的對象,可能是這個樣子:

object storedData { 
    lazy val data : Map[...] = // read file 
} 

然後,您可以從這個閱讀通過在程序中的任何位置調用storedData.data。

+0

因此,單例對象不會被垃圾回收刪除?我可以打電話嗎?如果它不存在,它會執行「構造函數」(我讀取文件時使用的惰性val),如果它已經存在,它只是被採用?這很酷。我會嘗試。非常感謝。 :) – bam098 2013-05-08 15:09:51

+0

我相信可以有其他的東西與單身人士對象,但在一個很高的,這正是他們的工作方式。將它稱爲構造函數並不是「正確的」,它只是一個值域。但是,lazy關鍵字意味着它在第一次調用時進行評估,然後存儲在內存中。 – 2013-05-08 15:31:12

+0

@SimonTodd我會說這是正確的,因爲scala類的主體被認爲是主要構造函數。不使用'懶惰'的對象與唯一的領域是有點不必要的? – 2013-05-08 15:42:01

相關問題