gama Kotlin de la función (funciones Alcance)

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, alsoescenarios 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

  1. referencias de las funciones dentro del modo de objeto de destino
  2. 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 itse hace, es decir, itque corresponde al personBobobjeto, 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á Unitobjetos, 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 resultListdesaparecieron.

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 someStrasignación, asegurando de este modo someStrno aparece excepción de puntero nulo, pero a veces no determina someStrel 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 someStrvez, por ejemplo, que desee obtener su longitud, llamada directa someStr.lengthserá 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 letun complemento completo ?.de llamadas o letbloque de ituso ?., 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 itcambio 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 thisuna 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 itun 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

Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 5746

Supongo que te gusta

Origin blog.csdn.net/weixin_46221133/article/details/104582116
Recomendado
Clasificación