解码以下 Scala 代码

Decoding the below Scala code

在阅读一本关于 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")   
}

谁能一步步向我解释代码?

feedsMap[String, String] 将一个人映射到博客。

然后该映射使用 filter 进行迭代,它会尝试过滤任何以大写字母 D 开头且其值包含单词 "pragprog".[=25 的作者=]

当您在 Mapfilter 时,您会得到一个元组,该元组的第一个元素是键,第二个元素是值。使用圆括号,它看起来像这样:

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