Analyse du code source du filterNot de Kotlin

L'auteur se concentre sur le domaine de la sécurité Android. Bienvenue à prêter attention à mon compte public personnel WeChat "Android Security Engineering" (cliquez pour scanner le code à suivre). Le compte public personnel WeChat se concentre principalement sur la protection de la sécurité et l'analyse inverse des applications Android, partageant diverses méthodes d'attaque et de défense de sécurité, la technologie Hook, la compilation ARM et d'autres connaissances liées à Android.

Le code source d'implémentation de Kotlin filterNotest le suivant :

/**
 * 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
}

Les deux fonctions acceptent un paramètre de prédicat, l'expression lambda pour la condition de filtre. Lors de l'exécution de la fonction, si le prédicat renvoie faux, cela signifie que l'élément est conservé ; s'il renvoie vrai, cela signifie que l'élément est filtré.

Plus précisément, ces deux fonctions utilisent en interne une implémentation basée sur des boucles for et des instructions if. Ils traverseront le conteneur d'entrée, utiliseront le prédicat pour juger chaque élément, puis choisiront de conserver l'élément en fonction du résultat du jugement. Les éléments filtrés sont ajoutés à un nouvel objet List ou à une liste cible, et finalement renvoyés à l'appelant.

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

c'est un mot clé qui représente l'objet courant ou la fonction en cours d'exécution. Ici, this fait référence à l'objet utilisant la fonction filterNotTo, c'est-à-dire l'objet conteneur de type Iterable. L'instruction for (élément dans this) parcourt tous les éléments de l'objet conteneur this. Étant donné que ce conteneur implémente l'interface Iterable, il peut être parcouru directement à l'aide de la boucle for-in.

Par conséquent, la signification du code pour (element in this) if (!predicate(element)) destination.add(element) est : lors de la traversée d'un élément dans cet objet conteneur, si l'élément ne remplit pas les conditions du prédicat fonction , puis ajoutez-la à la destination de la liste cible. Une fois le parcours terminé, la fonction renvoie l'objet de liste cible lui-même.

prédicat : (T) -> Boolean est une déclaration de paramètre d'un type de fonction (Function Type). Plus précisément, il représente une fonction qui accepte un paramètre de type T et renvoie un résultat de type booléen.

Ce type de fonction est utilisé comme condition de filtre dans les fonctions filterNot() et filterNotTo(). Les utilisateurs peuvent transmettre une expression lambda en tant que prédicat de paramètre et spécifier la logique de filtrage requise dans cette expression lambda.

Par predicate: (T) -> Booleanexemple, en supposant une liste d'entiers listOf(1, 2, 3, 4, 5), nous pouvons utiliser la fonction filterNot() pour filtrer tous les éléments qui ne sont pas des nombres pairs :

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

Ici, { it % 2 == 0 } est une expression lambda qui prend un argument entier et renvoie une valeur booléenne, que l'entier soit pair ou non. Dans la fonction filterNot(), cette expression lambda est transmise en tant que prédicat de paramètre. La fonction parcourt toute la liste et appelle le prédicat une fois pour chaque élément afin de déterminer s'il répond aux conditions du filtre. Pour les éléments ne remplissant pas les conditions, ils seront mis dans une nouvelle liste et finalement renvoyés à l'utilisateur.

Guess you like

Origin blog.csdn.net/HongHua_bai/article/details/131270278