2017-01-25 1 views
2

en lisant un livre sur Scala je suis tombé sur le code suivant. Suis incapable de séparer le code dans la fonction, les paramètres, les variables.Décoder le Code ci-dessous Scala

val feeds = Map("Andy Hunt" -> "blog.toolshed.com", 
       "Dave Thomas" -> "pragdave.me",  
       "NFJS"  -> "nofluffjuststuff.com/blog") 

val fiterName = feeds filter { element => 
    val (key, value) = element  
    (key startsWith "D") && (value contains "pragprog") 
} 

Quelqu'un peut-il m'expliquer le code étape par étape?

Répondre

6

feeds est une Map[String, String] qui applique une personne sur un blog.

Ensuite, cette carte est itère avec un filter, qui tente de filtrer tout auteur qui commence par la lettre majuscule D et sa valeur contient le mot « pragprog ».

Lorsque vous filter sur un Map, vous obtenez un tuple qui a la clé en tant que premier élément et la valeur en tant que deuxième élément. En utilisant les supports ronds, il ressemble à ceci:

val filterName = feeds.filter(element => { 
    val (key, value) = element  
    key.startsWith("D") && value.contains("pragprog") 
}) 

Notez que le filtre lui-même est un higher order function, il faut une autre fonction en entrée. Cette fonction prend un argument de type A, qui dans notre cas est un tuple (String, String), et produit un booléen qui indique si l'élément correspond à la condition ou non. A l'intérieur du filtre, ils ont utilisé Déconstruction tuple:

val (key, value) = element  

qui prend une méthode Tuple2[String, String] et appelle est unapply, vous permettant d'accéder aux composants du tuple par son nom, et non par ._1 et _.2

+0

Eh bien, je compris que regarder le code, mais ce que je me demande est? Selon le filtre de spécification prend un prédicat (String, String) => Boolean. Dans cet esprit, que signifie val (clé, valeur) = élément? puis sur quelle valeur l'expression booléenne (startsWith touche « D ») && (valeur contient « pragprog ») est invoquée? – Gurupraveen

+0

@Gurupraveen mis à jour la réponse à réfléchir à votre question. –

+0

Merci, c'était une bonne explication et convaincante – Gurupraveen