2016-03-08 46 views
3

我想初始化val屬性,但屬性初始化是複雜的(包含幾行代碼):多線/複雜屬性初始值設定沒有拉姆達

private val properties: Properties = { 
    val properties = Properties() 
    val stream = Application::class.java.getResourceAsStream("application.properties") 
    properties.load(stream) 
    properties 
}.invoke() 

是否有可能重新寫不使用這個屬性初始化拉姆達?

+1

您可以用'運行{}'這裏,而不是調用'調用()' – voddan

回答

6

apply擴展功能,非常適用於這樣的使用情況。使用此功能,您的代碼可以寫成這樣:

private val properties = Properties().apply { 
    load(Application::class.java.getResourceAsStream("application.properties")) 
} 
4

您可以使用apply如果你正在創建的東西實例可以在一開始分配,然後要修改它。當你有一件事時,使用let(),但想把它變成另一件事。當你什麼都沒有開始時,你可以使用run(),並建立一些東西返回。

使用適用

private val properties = Properties().apply { 
    load(Application::class.java.getResourceAsStream("application.properties")) 
} 

或使用:(不是最好的例子,但你明白了吧)

private val properties = Application::class.java.getResourceAsStream("application.properties") 
    .let { stream -> 
       val props = Properties() 
       props.load(stream) 
       props 
     } 

或使用運行

private val properties = run { 
    val properties = Properties() 
    val stream = Application::class.java.getResourceAsStream("application.properties") 
    properties.load(stream) 
    properties 
} 

一些圖書館創建了這些變體,並將它們稱爲verifiedByinitializedBy,它們基本上可以做同樣的事情,但要明確意圖。創建新的函數以便您的代碼以您想要的方式讀取,但也可以通過嘗試使用stdlib函數來平衡該函數,因爲這與其他Kotlin用戶一致。