Directorio artículo
1 Información general
El rango es una función capaz de actuar Block (bloque de código, también se puede llamar un cierre o funciones anónimas) en un objeto, y puede fácilmente una referencia al objeto de destino en el bloque de código de manera que la lógica de código de simplificar, reduciendo la eficacia de la variable intermedia. Kotlin gama función de la biblioteca estándar de un total de cinco let, run, with, apply, also
escenarios diferentes utilizando diferentes funciones puede reducir una gran cantidad de mano de obra, pero para mí no es un alto nivel de Inglés y otros sedimentos, sólo desde el punto de vista de la palabra semántica no sabía cómo distinguir los cinco a. Si realmente no tiene control de su inseparable, y un tiro directo de distancia, con la sintaxis Kotlin más primitivo todavía puede escribir la función. Que estaba haciendo antes, cada uno lee sus definiciones para saber cómo utilizar, durante un período de tiempo que no Kotlin escritura olvidaron que están haciendo es, pero a ver una gran cantidad de código fuente abierto es ampliamente utilizado gama de funciones, y así quieren escribir un blog consolidarla.
2 ¿Cómo distinguir
Esta gama de cinco funciones son muy similares en la práctica, con el fin de distinguirlos principalmente tienen que empezar desde los dos aspectos siguientes
- referencias de las funciones dentro del modo de objeto de destino
- valor de retorno de la función
Código de abajo se puede observar y dejar que se aplica sobre las características de funcionamiento de los dos
@Test
fun callScopeFunctions_referenceAndReturnValue() {
val personBob = Person(18, "bob", "China").let {
// it 代表 personBob 对象
it.name = "Bob"
println(it)
it // 在 block 最后写一个值代表此 block 的返回值
}
assertEquals(personBob.name, "Bob")
val personAlice = Person(17, "alice", "USB").apply {
// 可以在此 block 中直接访问 person 成员属性
name = "Alice"
print(this)
}
assertEquals(personAlice.name, "Alice")
}
// Person 定义
class Person(
var age: Int,
var name: String?,
var address: String?
) {
override fun toString(): String {
return "I'm $name, $age years old, and come from $address"
}
}
Puede aparecer cuando sea necesario observar el interior de una función de referencia dejar que personBob it
se hace, es decir, it
que corresponde al personBob
objeto, deje final del bloque para escribir una posición it
únicamente para propósitos de ilustración permiten valor de retorno del último bloque es un valor de bloqueo, si es la última palabra , personBob vendrá Unit
objetos, ya que println(it)
no devuelve ningún valor o el valor de retorno es nULL, la hipótesis nula es en la Unidad Kotlin.
En la función de aplicar, esto representa objetos personAlice, donde esto se puede omitir, por lo que se convierte en una función directa en el funcionamiento del aplican las variables persona miembros, el bloque final es el valor de retorno de este objeto se aplica, a partir de la última línea de código Tiene un impacto.
Aquí referencia principalmente valor y devolver una breve descripción de la función de las diferencias de rango de realización, el punto de aplicación a continuación para analizar el papel de estas funciones.
3 escenarios
Los ejemplos de esta sección hace referencia sólo a una parte del escenario, sólo como referencia, con el fin de distinguir claramente la función al principio de cada función se explicará cómo los objetos de referencia y retorno si lo de valor.
3.1 let
objeto de referencia es, el valor de retorno es la última línea del bloque de código (que se llama como profesional "valor de retorno lambda")
Escenario 1: encadenado llamadas
Debido a que el valor de retorno es el valor representado por la última línea (referido como lambdaResult), por lo que puede directamente lambdaResult referencia en el exterior del bloque, y es que se puede llamar la cadena, tales como
objA.let{
// blabla
objB
}.let{
// blabla
objC
}.let ...
Poner un ejemplo concreto fue escrito antes
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList)
Ahora se puede escribir una
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let {
println(it)
// 可以在此处添加另外一个对象,然后
}// 在这里接着用 .let{} 继续处理
Mira, variables intermedias resultList
desaparecieron.
Escena 2: El objeto no está vacía antes de que el bloque de ejecución
En Kotlin con el fin de evitar una excepción de puntero nulo se puede introducir la selección (opcional), la selección puede evitar que aparezca la siguiente declaración
var someStr: String = null // 会出现编辑错误("Null can not be a value of a non-null type String")
Esto se debe dar en la etapa de edición de someStr
asignación, asegurando de este modo someStr
no aparece excepción de puntero nulo, pero a veces no determina someStr
el valor, por lo que vamos a darle un valor nulo, se puede utilizar para escribir tareas, tales como
var someStr: String? = null
En uso la próxima someStr
vez, por ejemplo, que desee obtener su longitud, llamada directa someStr.length
será error de sintaxis ( "sólo es seguro (?.) O no nulo afirmado se permiten las llamadas en un receptor de tipo String anulable?"), Entonces deja podemos balsas útil
someStr?.let {
// 如果 someStr 为 null,则此 block 不会执行,且返回值为 null
it.length
}
Tenga en cuenta que en este caso la cadena de llamadas, la necesidad de que ?.
después de let
un complemento completo ?.
de llamadas o let
bloque de it
uso ?.
, tales como
someStr?.let {
it.length
personBob // Person 对象
}?.let {
val name = it.name
// blabla
}
// 或着下面这种写法
someStr?.let {
it.length
personBob // Person 对象
}.let {
val name = it?.name
// blabla
}
Escenario 3: Cambie el nombre del objeto, y mejorar la legibilidad del código
Nada que decir, es el cambio de nombre de la variable, a it
cambio de otro nombre, para que sea la doctrina más en forma, como por ejemplo
val p = Person(18, "Bob", "China")
p.let { bob -> // 使用 bob 代替 it,它比 p 主义更清楚(瞎写的,有可能没 p 主义清楚,但大概就是这么个意思)
val name = bob.name
}
3.2 con
Audiencia por el with(obj)
que pasa el bloque interno usando this
una referencia, el valor de retorno se devuelve lambda valor
Escenario 1: Indica que este objeto, y luego hacer las siguientes cosas
valor de retorno lambda entonces por lo general no se utiliza, tales como la inicialización Android WebView admite el código JS y luego utilizar la Configuración
val webView = WebView(ctx)
with(webView){
settings.javaScriptEnabled = true
}
Escena 2: valor objetivo de la operación y devuelve el resultado en
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
first() + last()
}
println(firstAndLast) // 输出结果为:onethree
Llamando objeto es simplificar las variables públicas en el bloque, sin sentir nada Dayong.
3.3 plazo
objeto de referencia es la siguiente, el valor lambda se devuelve el valor de retorno
Escenario 1: Básico y dejar que la misma
A diferencia de dejar que it
un convertidothis
Escena 2: Como una función no-propagación (función no extensión)
val hexNumberRegex = run {
val digits = "0-9"
val hexDigits = "A-Fa-f"
val sign = "+-"
Regex("[$sign]?[$digits$hexDigits]+")
}
for (match in hexNumberRegex.findAll("+1234 -FFFF not-a-number")) {
println(match.value)
}
Medios lo que significa, que sienten que esto es una claridad poco confundido del código, miré el siguiente código más cómodo
for (match in hexNumberRegex().findAll("+1234 -FFFF not-a-number")) {
println(match.value)
}
fun hexNumberRegex(): Regex {
val digits = "0-9"
val hexDigits = "A-Fa-f"
val sign = "+-"
return Regex("[$sign]?[$digits$hexDigits]+")
}
3.4 aplican
Referencia a objeto de esto, sino también devolver el objeto a esta
"¿Cómo distinguir" de ejemplo, esto se puede hacer encadenado a la llamada, pero el objeto de llamada es el objeto original en sí.
3.5 también
objeto de referencia a ella, volver a este tema
val numbers = mutableListOf("one", "two", "three")
numbers
.also { println("The list elements before adding new one: $it") }
.add("four")
Esta función siempre se sintió a hacer los números, puede utilizar aplicar wow.
4 Resumen
Cinco tipos de rango de la función y el papel del análisis de escenarios es más, de hecho, se completaron dos funciones: en primer lugar, para cambiar la referencia al objeto original, reducir o aumentar la legibilidad del código no tiene nada que hacer, y el segundo, un valor para las llamadas de retorno de la cadena. Sus características que se muestran en la siguiente tabla
función | cita | El valor de retorno | Ya sea para apoyar la expansión (llamada de la cadena) |
---|---|---|---|
dejar | eso | valor de retorno lambda | es |
correr | esta | valor de retorno Lamdba | es |
ejecutar (escena 2) | - | valor de retorno lambda | no |
con | esta | valor de retorno lambda | no |
aplicar | esta | esta | es |
además | eso | esta | es |
* Referencia
https://kotlinlang.org/docs/reference/scope-functions.html