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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |