Mar*_*ing 19 scala list-comprehension
当我第一次开始关注Scala时,我喜欢看起来很容易理解.它们似乎有点像我从Java 5习惯的foreach循环,但具有功能限制和很多甜美的语法好处.
但正如我已经吸收了Scala的风格,我发现我每次可以使用一个换comprension我使用map,flatMap,filter,reduce和foreach来代替.代码的意图对我来说似乎更清晰,潜在的隐藏意外更少,而且它们通常也是更短的代码.
据我所知,无论如何,for-comprehension总是编译成这些方法,所以我想知道:它们实际上是为了什么?我错过了一些功能性的复兴(这不是第一次)?为了理解做其他功能不能做的事情,或者至少会笨拙地做些什么?他们是否根据特定用例发光?这真的只是个人品味的问题吗?
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,因为我认为他们更好地表达了我正在做的事情的意图,而不是表达方式.
在某些情况下,因为理解可以更好地表达意图,所以当他们这样做时,使用它们.
另请注意,为了理解,您可以免费获得模式匹配.例如,为了理解,迭代Map更简单:
for ((key, value) <- map) println (key + "-->" + value)
而不是与foreach:
map foreach { case (key, value) => println (key + "-->" + value) }
| 归档时间: |
|
| 查看次数: |
10771 次 |
| 最近记录: |