解码下面的Scala代码

时间:2017-01-25 12:29:26

标签: scala scala-collections

在阅读有关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")   
}

有人可以一步一步地解释我的代码吗?

1 个答案:

答案 0 :(得分:6)

feedsMap[String, String],可将某人映射到博客。

然后该地图使用filter进行迭代,该D会尝试过滤以大写字母filter开头的任何作者,并且其值包含单词“pragprog”。

当您Map上的val filterName = feeds.filter(element => { val (key, value) = element key.startsWith("D") && value.contains("pragprog") }) 时,您会得到一个元组,其中键为第一个元素,值为第二个元素。使用圆括号,它看起来像这样:

A

请注意,过滤器本身是higher order function,它需要另一个函数作为输入。此函数采用类型(String, String)的参数,在我们的示例中是一个元组val (key, value) = element ,并生成一个布尔值,指示元素是否与条件匹配。在过滤器内部,他们使用元组解构:

Tuple2[String, String]

这需要unapply并调用它的._1方法,允许您按名称访问元组的组件,而不是通过_.2class MenuItem implements Serializable<MenuItem>{ name: string; link: string; styles: string; children: MenuItem[]; }