Inicializador de propiedad de múltiples líneas / complejo sin lambda

Quiero inicializar la propiedad val pero el inicializador de propiedad es complejo (contiene varias líneas de código):

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

¿Es posible volver a escribir este inicializador de properties sin usar lambda?

Hay una function de extensión de apply que es perfecta para tal caso de uso. Usando esta function tu código puede ser reescrito como:

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

Puede usar apply si su instancia de lo que está creando se puede asignar al inicio y luego desea modificarla. Use let() cuando tenga una cosa, pero quiera convertirla en otra. Puede usar run() cuando comienza sin nada y crea algo para regresar.

Usando aplicar :

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

o usando let : (no es el mejor ejemplo, pero entiendes el punto)

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

o usando ejecutar :

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

Algunas bibliotecas crean variaciones de estos y los llaman cosas como verifiedBy o initializedBy que básicamente hacen lo mismo pero aclaran la intención. Cree nuevas funciones para que su código lea de la manera que desee, pero también equilibre eso al tratar de usar funciones stdlib, ya que eso es coherente con otros usuarios de Kotlin.

  • por qué kotlin lambda descomstackdo en código java es (Function0) null.INSTANCE
  • Kotlin no puede acceder a kotlin.jvm.functions.Function1 cuando llama a la function kotlin con java lambda
  • ¿Cuál es el propósito de Lambda's con Receiver?
  • Funciones de mayor order de Kotlin en el proyecto de Java
  • Comparador como lambda
  • ¿Por qué Kotlin no puede inferir el siguiente argumento lambda (después de la conversión de Java -> Kotlin)?
  • Expresiones Lambda en Kotlin
  • Disruptor LMAX con Kotlin: ¿No se puede usar lambda?
  • Enlace de datos: el campo Observable con valor lambda no comstack
  • Kotlin, Proguard y lambdas
  • Emitir no seleccionado al lanzar un object de tipo Cualquiera? en una lambda en kotlin