Análisis del código fuente del filterNot de Kotlin

El autor se centra en el campo de la seguridad de Android. Bienvenido a prestar atención a mi cuenta pública personal de WeChat "Ingeniería de seguridad de Android" (haga clic para escanear el código a seguir). La cuenta pública personal de WeChat se enfoca principalmente en la protección de seguridad y el análisis inverso de las aplicaciones de Android, compartiendo varios métodos de ataque y defensa de seguridad, tecnología Hook, compilación ARM y otros conocimientos relacionados con Android.

El código fuente de implementación de Kotlin filterNotes el siguiente:

/**
 * Returns a list containing all elements that don't satisfy the given [predicate].
 */
public inline fun <T> Iterable<T>.filterNot(predicate: (T) -> Boolean): List<T> {
    
    
    return filterNotTo(ArrayList(), predicate)
}

/**
 * Appends all elements that don't satisfy the given [predicate] to the given [destination].
 *
 * @return the destination list.
 */
public inline fun <C : MutableCollection<in T>, T> Iterable<T>.filterNotTo(destination: C, predicate: (T) -> Boolean): C {
    
    
    for (element in this) if (!predicate(element)) destination.add(element)
    return destination
}

Ambas funciones aceptan un parámetro de predicado, la expresión lambda para la condición de filtro. En la ejecución de funciones, si el predicado devuelve falso, significa que el elemento se conserva; si devuelve verdadero, significa que el elemento se filtra.

Específicamente, estas dos funciones utilizan internamente una implementación basada en bucles for y sentencias if. Recorrerán el contenedor de entrada, usarán el predicado para juzgar cada elemento y luego elegirán si conservar el elemento de acuerdo con el resultado del juicio. Los elementos filtrados se agregan a un nuevo objeto List o lista de destino y finalmente se devuelven a la persona que llama.

for (element in this) if (!predicate(element)) destination.add(element)

esta es una palabra clave que representa el objeto actual o la función que se está ejecutando actualmente. Aquí, esto se refiere al objeto que usa la función filterNotTo, es decir, el objeto contenedor del tipo Iterable. La instrucción for (elemento en este) recorre todos los elementos en el objeto contenedor this. Debido a que este contenedor implementa la interfaz iterable, se puede recorrer directamente mediante el bucle for-in.

Por lo tanto, el significado del código para (elemento en este) si (!predicado(elemento)) destino.añadir(elemento) es: al atravesar un elemento en este objeto contenedor, si el elemento no cumple las condiciones del predicado luego agréguelo al destino de la lista de objetivos. Una vez que se completa el recorrido, la función devuelve el objeto de la lista de destino en sí.

predicado: (T) -> Boolean es una declaración de parámetro de un tipo de función (Tipo de función). En concreto, representa una función que acepta un parámetro de tipo T y devuelve un resultado de tipo booleano.

Este tipo de función se usa como condición de filtro en las funciones filterNot() y filterNotTo(). Los usuarios pueden pasar una expresión lambda como predicado del parámetro y especificar la lógica de filtrado requerida en esta expresión lambda.

Por predicate: (T) -> Booleanejemplo, suponiendo una lista de enteros listOf(1, 2, 3, 4, 5), podemos usar la función filterNot() para filtrar todos los elementos que no son números pares:

val oddNumbers = listOf(1, 2, 3, 4, 5).filterNot {
    
     it % 2 == 0 }
println(oddNumbers) // [1, 3, 5]

Aquí, { it % 2 == 0 } es una expresión lambda que toma un argumento entero y devuelve un valor booleano ya sea que el entero sea par o no. En la función filterNot(), esta expresión lambda se pasa como el predicado del parámetro. La función recorre toda la lista y llama al predicado una vez por cada elemento para determinar si cumple las condiciones del filtro. Los elementos que no cumplan las condiciones se colocarán en una nueva lista y finalmente se devolverán al usuario.

Supongo que te gusta

Origin blog.csdn.net/HongHua_bai/article/details/131270278
Recomendado
Clasificación