斯卡拉的理解:重要特征还是语法糖?

Mar*_*ing 19 scala list-comprehension

当我第一次开始关注Scala时,我喜欢看起来很容易理解.它们似乎有点像我从Java 5习惯的foreach循环,但具有功能限制和很多甜美的语法好处.

但正如我已经吸收了Scala的风格,我发现我每次可以使用一个换comprension我使用map,flatMap,filter,reduceforeach来代替.代码的意图对我来说似乎更清晰,潜在的隐藏意外更少,而且它们通常也是更短的代码.

据我所知,无论如何,for-comprehension总是编译成这些方法,所以我想知道:它们实际上是为了什么?我错过了一些功能性的复兴(这不是第一次)?为了理解做其他功能不能做的事情,或者至少会笨拙地做些什么?他们是否根据特定用例发光?这真的只是个人品味的问题吗?

Dan*_*ral 14

请参考这个问题.简短的回答是,理解可以更具可读性.特别是,如果你有许多嵌套的生成器,你所做的实际范围变得更加清晰,并且你不需要大的缩进.


Wal*_*ang 11

理解的另一个重要用途是内部DSL. ScalaQL就是一个很好的例子.它可以扭转这一局面

val underAge = for { 
  p <- Person 
  c <- Company 
  if p.company is c 
  if p.age < 14 
} yield p 
Run Code Online (Sandbox Code Playgroud)

进入这个

SELECT p.* FROM people p JOIN companies c ON p.company_id = c.id WHERE p.age < 14 
Run Code Online (Sandbox Code Playgroud)

还有更多.


Eri*_*cht 10

理解是语法糖,但这并不意味着它们不重要.它们通常比它们的扩展形式更简洁,这很好,但更重要的是它们可以帮助命令式语言的程序员使用功能结构.

当我第一次开始使用Scala时,我使用了很多理解,因为他们很熟悉.然后我几乎完全停止了,因为我觉得使用底层方法更明确,因此更清晰.现在我又回到了使用for -reherehension,因为我认为他们更好地表达了我正在做的事情的意图,而不是表达方式.


thS*_*oft 5

在某些情况下,因为理解可以更好地表达意图,所以当他们这样做时,使用它们.

另请注意,为了理解,您可以免费获得模式匹配.例如,为了理解,迭代Map更简单:

for ((key, value) <- map) println (key + "-->" + value)

而不是与foreach:

map foreach { case (key, value) => println (key + "-->" + value) }