加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala代码的接受/推荐语法是多少方法链?

发布时间:2020-12-16 09:39:40 所属栏目:安全 来源:网络整理
导读:在Scala中,我倾向于在大量的表达式中编写大型链接表达式,而不需要赋值。在我的公司,我们已经形成了这种类型的代码的风格。这是一个完全有创意的例子(想法是显示一个表达式,带有很多链接的调用): import scala.util.Randomval table = (1 to 10) map { (
在Scala中,我倾向于在大量的表达式中编写大型链接表达式,而不需要赋值。在我的公司,我们已经形成了这种类型的代码的风格。这是一个完全有创意的例子(想法是显示一个表达式,带有很多链接的调用):

import scala.util.Random
val table = (1 to 10) map { (Random.nextInt(100),_) } toMap

def foo: List[Int] =
  (1 to 100)
    .view
    .map { _ + 3 }
    .filter { _ > 10 }
    .flatMap { table.get }
    .take(3)
    .toList

我通常喜欢的Daniel Spiewak的Scala Style Guide(pdf)表明,链接方法调用中的前导点符号可能是坏的(参见doc:方法调用/高阶函数),尽管它不涵盖像这样的多行表达式直。

是否还有另一个更接受/惯用的方法来写上面的功能foo?

更新:2011年6月28日

下面很多很好的答案和讨论。似乎没有100%的“你必须这样做”的答案,所以我将接受最受欢迎的投票答案,这是目前的理解方式。就我个人而言,我想现在要坚持使用领先的符号,并接受它带来的风险。

解决方法

这个例子稍微不切实际,但对于复杂的表达式,使用理解通常会更加清晰:

def foo = {
  val results = for {
    x <- (1 to 100).view
    y = x + 3 if y > 10
    z <- table get y
  } yield z
  (results take 3).toList
}

这里的其他优点是您可以命名中间阶段的计算,并使其更加自我记录。

如果简单是你的目标,那么这可以很容易地被做成一个单行(无点式的风格在这里有帮助):

def foo = (1 to 100).view.map{3+}.filter{10<}.flatMap{table.get}.take(3).toList
//or
def foo = ((1 to 100).view map {3+} filter {10<} flatMap {table.get} take 3).toList

并且一如既往地在可能的情况下优化算法:

def foo = ((1 to 100).view map {3+} filter {10<} flatMap {table.get} take 3).toList
def foo = ((4 to 103).view filter {10<} flatMap {table.get} take 3).toList
def foo = ((11 to 103).view flatMap {table.get} take 3).toList

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读