我有一个包含 Foos 集合的类,我们将其称为 Bar。Foo 有许多我们希望在 Bar 级别聚合的数字返回方法,如下所示:
def attribute1(inputs: Map[Int, Double]) =
foos.foldLeft(0d)((sum, foo) => sum + foo.attribute1(inputs(foo.id)))
为了聚合这些不同的属性,我可以有 n 个形式的函数
def attributeN(inputs: Map[Int, Double]) =
foos.foldLeft(0d)((sum, foo) => sum + foo.attributeN(inputs(foo.id)))
然而,这很难看——我讨厌迭代和求和被重复的事实。我想抽象一下,所以我可以做类似的事情:
def attribute1(inputs: Map[Int, Double]) = aggregate(Foo.attribute1, inputs)
private def aggregate(f: Double => Double) = foos.foldLeft(0d)((sum, foo) => sum + foo.f(inputs(foo.id)
当然,这不起作用,因为不能将 Foo.attribute1 作为函数引用 - 。不是函数实例。
我基本上偶然发现了各种解决方案,但每一个都会导致每种聚合方法的代码至少与我们没有助手的情况一样冗长或复杂,而且我只剩下迭代的重复。
我可能只是在这里希望太多,但我几乎可以肯定有一种优雅的方式可以做到这一点,那就是 Scala 正在逃避我。所以,这里有任何回答的 Scala 大师 - 在此先感谢!