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

Max*_*kov 5 lambda kotlin

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

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

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

Jay*_*ard 7

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

使用申请:

private val properties = Properties().apply {
   load(Application::class.java.getResourceAsStream("application.properties")) 
}
Run Code Online (Sandbox Code Playgroud)

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

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

或使用run:

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

有些库会创建这些变体并将它们称为类似verifiedByinitializedBy基本上做同样的事情,但要明确其意图.创建新函数,以便您的代码以您想要的方式读取,但也可以通过尝试使用stdlib函数来平衡,因为这与其他Kotlin用户一致.


Vla*_*nov 6

apply扩展功能,非常适合这种用例.使用此功能可以重写代码,如:

private val properties = Properties().apply {
  load(Application::class.java.getResourceAsStream("application.properties"))
}
Run Code Online (Sandbox Code Playgroud)