2017-01-25 3 views
2

При чтении книги на Scala я наткнулся на следующий код. Невозможно выделить код в функции, параметры, переменные.Декодирование кода 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") 
} 

Может кто-нибудь объяснить мне код шаг за шагом?

ответ

6

feeds является Map[String, String], который отображает человека в блог.

Затем эта карта выполняет итерацию с помощью filter, которая пытается отфильтровать любого автора, который начинается с заглавной буквы D, а его значение содержит слово «pragprog».

Когда вы filter на Map, вы получаете кортеж, который имеет ключ как первый элемент и значение как второй элемент. Использование круглых скобок, это выглядит следующим образом:

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

Обратите внимание, что фильтр само по себе является higher order function, он принимает другую функцию в качестве входных данных. Эта функция принимает аргумент типа A, который в нашем случае является кортежем (String, String) и создает логическое значение, которое указывает, соответствует ли элемент условию или нет. Внутри фильтра, они использовали кортеж деконструкции:

val (key, value) = element  

Который берет Tuple2[String, String] и называет это unapply метод, позволяющий получить доступ к компонентам кортежа по имени, а не через ._1 и _.2

+0

Ну я понял что смотрит на код, но что интересно? В соответствии с фильтром spec берет предикат (String, String) => Boolean. Имея это в виду, что означает val (ключ, значение) = элемент? то на каком значении вызывается логическое выражение (key startsWith «D») && (значение содержит «pragprog»)? – Gurupraveen

+0

@Gurupraveen Обновлен ответ, чтобы отразить ваш вопрос. –

+0

Спасибо, это было хорошим объяснением и убедительным – Gurupraveen