deja, también, aplica, toma, toma, toma, sin, en, Kotlin

Leí muchos documentos de Kotlin sobre estos artículos. Pero no puedo entender tan claramente.

¿Cuál es el uso de Kotlin para dejar , también , tomar y tomar a less que en detalle?

Necesito un ejemplo de cada artículo. Por favor, no publique la documentation de Kotlin. Necesito un ejemplo en time real y uso casos de estos artículos.

dejar

public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

Toma el receptor y pásalo a una function pasada como parámetro. Devuelve el resultado de la function.

 val myVar = "hello!" myVar.let { println(it) } // Output "hello!" 

Puede usar let para una verificación de security nula:

 val myVar = if (Random().nextBoolean()) "hello!" else null myVar?.let { println(it) } // Output "hello!" only if myVar is not null 

además

public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

Ejecute la function pasada con el receptor como parámetro y devuelva el receptor .
Es como dejar, pero siempre devuelve el receptor , no el resultado de la function.

Puede usarlo para hacer algo en un object.

 val person = Person().also { println("Person ${it.name} initialized!") // Do what you want here... } 

TakeIf

public inline fun <T> T.takeIf(pnetworkingicate: (T) -> Boolean): T? = if (pnetworkingicate(this)) this else null

Devuelve el receptor si la function (pnetworkingicado) devuelve verdadero, de lo contrario, devuelve nulo.

 println(myVar.takeIf { it is Person } ?: "Not a person!") 

takeUnless

public inline fun <T> T.takeUnless(pnetworkingicate: (T) -> Boolean): T? = if (!pnetworkingicate(this)) this else null

Igual que takeIf , pero con el pnetworkingicado invertido. Si es verdadero, devuelve nulo; de lo contrario, devuelve el receptor .

 println(myVar.takeUnless { it is Person } ?: "It's a person!") 

Ayuda

  • Puede usar https://try.kotlinlang.org/ para probarlo fácilmente. Puedes encontrar ejemplos aquí .
  • Puede consultar la fuente de la lib estándar aquí . let , also , takeIf y takeUnless aquí .

let, also, apply, takeIf, takeUnless son funciones de extensión en Kotlin.

Para comprender esta function, debe comprender las funciones de extensión y las funciones Lambda en Kotlin.

Función de extensión:

Mediante el uso de la function de extensión, podemos crear una function para una class sin henetworkingar una class.

Kotlin, similar a C # y Gosu, proporciona la capacidad de extender una class con nuevas funcionalidades sin tener que henetworkingar de la class o utilizar cualquier tipo de patrón de layout como Decorator. Esto se hace a través de declaraciones especiales llamadas extensiones. Kotlin admite funciones de extensión y properties de extensión.

Entonces, para encontrar solo numbers en la String , puede crear un método como el siguiente sin henetworkingar String class String .

 fun String.isNumber(): Boolean = this.matches("[0-9]+".toRegex()) 

puede usar la function de extensión anterior como esta,

 val phoneNumber = "8899665544" println(phoneNumber.isNumber) 

que es impresiones true .

Funciones Lambda:

Las funciones de Lambda son como Interface en Java. Pero en Kotlin, las funciones lambda se pueden pasar como un parámetro en funciones.

Ejemplo:

 fun String.isNumber(block: () -> Unit): Boolean { return if (this.matches("[0-9]+".toRegex())) { block() true } else false } 

Como puedes ver, el bloque es una function lambda y se pasa como un parámetro. Puede usar la function anterior de esta manera,

 val phoneNumber = "8899665544" println(phoneNumber.isNumber { println("Block executed") }) 

La function anterior se imprimirá así,

 Block executed true 

Espero que ahora tengas una idea sobre las funciones de extensión y las funciones de Lambda. Ahora podemos ir a las funciones de extensión una a una.

dejar

 public inline fun <T, R> T.let(block: (T) -> R): R = block(this) 

Dos types T y R utilizados en la function anterior.

 T.let 

T podría ser cualquier object como class String. para que pueda invocar esta function con cualquier object.

 block: (T) -> R 

En el parámetro de let, puede ver la function lambda anterior. Además, el object invocado se pasa como un parámetro de la function. Entonces puede usar el object de class invocado dentro de la function. luego devuelve el R (otro object).

Ejemplo:

 val phoneNumber = "8899665544" val numberAndCount: Pair<Int, Int> = phoneNumber.let { it.toInt() to it.count() } 

En el ejemplo anterior, let toma String como parámetro de su function lambda y devuelve Pair a cambio.

Del mismo modo, funciona otra function de extensión.

además

 public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this } 

La function de extensión also toma la class invocado como un parámetro de function lambda y no devuelve nada.

Ejemplo:

 val phoneNumber = "8899665544" phoneNumber.also { number -> println(number.contains("8")) println(number.length) } 

aplicar

 public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this } 

Igual que también, pero el mismo object invocado pasó como function para que pueda usar las funciones y otras properties sin llamarlo o nombre de parámetro.

Ejemplo:

 val phoneNumber = "8899665544" phoneNumber.apply { number -> println(contains("8")) println(length) } 

En el ejemplo anterior, puede ver las funciones de la class String invocada directamente dentro de la function lambda.

TakeIf

 public inline fun <T> T.takeIf(pnetworkingicate: (T) -> Boolean): T? = if (pnetworkingicate(this)) this else null 

Ejemplo:

 val phoneNumber = "8899665544" val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) } 

En el ejemplo anterior, el number tendrá una cadena de phoneNumber solo que coincida con la regex . De lo contrario, será null .

takeUnless

 public inline fun <T> T.takeUnless(pnetworkingicate: (T) -> Boolean): T? = if (!pnetworkingicate(this)) this else null 

Es el reverso de takeIf.

Ejemplo:

 val phoneNumber = "8899665544" val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) } 

number tendrá una cadena de phoneNumber solo si no coincide con la regex . De lo contrario, será null .

  • El proyecto kotlin no se puede build en gradle (no se puede encontrar la reference)
  • ¿Existe alguna forma más simple de express classs anónimas en Kotlin?
  • TornadoFX filechooser
  • Una forma más simple o más funcional de encadenar objects en Kotlin
  • ¿Cómo se pone la expresión lambda después de los parameters en un map para llamar a la syntax legal?
  • Kotlin equivalente del operador ternario
  • Problema de actualización de Android Gradle plugin 3.0.0
  • kotlin android - Diálogo personalizado con patrón de construcción y Java 8 lambda
  • Dependencia de import de Maven Jetbrains expuesta
  • Kotlin: lanza una exception personalizada
  • Cómo ejecutar algún código cuando Gradle está construyendo las testings