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

时间:2016-03-08 19:00:56

标签: lambda kotlin

我想初始化val属性,但属性初始化程序很复杂(包含几行代码):

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

是否可以在不使用lambda的情况下重写此属性初始值设定项?

1 个答案:

答案 0 :(得分:7)

如果您创建的事物的实例可以在开始时分配,然后您想要修改它,则可以使用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用户一致。