没有lambda的多行/复杂属性初始值设定项

我想初始化val属性,但属性初始值设定项是复杂的(包含几行代码):

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

是否有可能不使用lambda重写此属性初始值设定项?

这种用例有apply扩展功能。 使用这个函数你的代码可以被重写为:

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

如果你正在创建的东西的实例可以在开始时被分配,然后你想修改它,你可以使用apply 。 使用let()当你有一件事情,但想把它变成另一个。 你可以在没有任何东西的时候使用run() ,并建立一些东西来返回。

使用apply

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

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

 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用户是一致的。