Scala Map语法

时间:2015-11-03 18:53:21

标签: scala dictionary

在查看Coursera Scala课程中的浇水问题代码时,我遇到了两种地图用法,我不懂语法。

我曾经:

a.map(b => b * b)

但我看到了:

a map something

例如:

next <- moves map path.extend

这意味着&#34;对于每个下一个移动,路径扩展(下一个)&#34;?

paths #:: from(more, explored ++ (more map (_.endstate)))

这是否意味着&#34;添加更多的国家/地区以进行探索&#34;?

2 个答案:

答案 0 :(得分:6)

在scala中,以下表达式是等效的:

moves map path.extend
moves map(path.extend)
moves.map(path.extend)
moves.map(m => path.extend(m))

以下是等同的:

more map (_.endstate)
more.map(_.endstate)
more.map(m => m.endstate)

答案 1 :(得分:1)

要回答您的第一个问题,我认为您对next <- moves map path.extend

的回答是正确的

我假设你正在谈论一个&#34;理解&#34;。例如,

val a = List (1, 3, 5)

a.map(b => b * b)
  //> res0: List[Int] = List(1, 9, 25)

for {
  blah <- a map (b => b * b)
} yield blah  
  //> res1: List[Int] = List(1, 9, 25)

您可以看到这两个返回相同的结果,在Scala中是等效的。

所以我们要对&#34; a&#34;中的每个元素说。调用函数(b =&gt; b * b)。

在您的示例中,它更像是这种情况:

case class Song(artists:List[String], title: String)

val songs = List(Song(List("Michael Jackson", "Janet Jackson"), "Scream"),
                             Song(List("Janet"), "Unbreakable"))

for {
  song <- songs
  artist <- song.artists
  if artist startsWith "Mic"
} yield song.title                                
  //> res0: List[String] =     List(Scream)

songs.flatMap(
    song => song.artists.withFilter(artist => artist startsWith "Mic").map(artist => song.title)
)                                                 
  //> res1: List[String] = List(Scream)

你可以看到这些也是等价的但是对于理解而言#34;更容易阅读。