gpt4 book ai didi

scala - 带有大量方法链接的Scala代码的接受/推荐语法是什么?

转载 作者:行者123 更新时间:2023-12-03 11:35:57 25 4
gpt4 key购买 nike

在Scala中,相对于许多带有val分配的较小表达式,我倾向于倾向于编写大型链表达式。在我公司,我们已经为这种类型的代码开发了一种样式。这是一个完全人为的示例(想法是显示带有许多链接调用的表达式):

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 Daniel Sewewak的 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

关于scala - 带有大量方法链接的Scala代码的接受/推荐语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com