Scala,将列表最后两项的总和添加到同一个列表中

Scala,将列表最后两项的总和添加到同一个列表中,scala,Scala,我是scala新手,我正在尝试对列表中的元素运行一个操作,我想将结果添加到同一个列表的末尾 现在我有 func(pos - 1 , list) :: func(pos - 1 , list).takeRight(2).sum 它可以完成这项工作,但非常难看,并且两次调用“func”。我想要一些像: func(pos - 1 , list).<somefunction>.takeright(2).sum func(位置1,列表)…取右键(2)。求和 但是我不知道该怎么做。我不明

我是scala新手,我正在尝试对列表中的元素运行一个操作,我想将结果添加到同一个列表的末尾

现在我有

func(pos - 1 , list) :: func(pos - 1 , list).takeRight(2).sum 
它可以完成这项工作,但非常难看,并且两次调用“func”。我想要一些像:

func(pos - 1 , list).<somefunction>.takeright(2).sum
func(位置1,列表)…取右键(2)。求和

但是我不知道该怎么做。

我不明白为什么您的工作代码会很难看,但是您可以通过将结果存储在局部变量中来消除冗余的方法调用。看起来您希望将最后两个项目的总和追加到列表中,因此您希望使用
:+
操作符而不是
,但请记住追加需要线性时间,而列表的前置是常量,因此您应该更喜欢后者

所以你能做的就是

val intermediate: List[Int] = func(pos - 1, list)
intermediate :+ intermediate.takeRight(2).sum
然而,为了向您展示在Scala中可以做什么,这里有一个更接近您所需输出的示例:

def main(args: Array[String]) {
  println(func(4, Nil).append(_.takeRight(2).sum)) // List(1, 2, 3, 5)
}

def func(i: Int, l: List[Int]): List[Int] = List(1, 2, 3)

implicit class PimpMyList(list: List[Int]) {
  def append(f: List[Int] => Int): List[Int] = {
    list :+ f(list)
  }
}
通过定义一个隐式类,您可以模拟一个更丰富的接口,并向
List
的接口添加一个新方法
append
。请注意,现在,
list.append(x)
只是
new-PimpMyList(list.append(x)
的隐式语法
append
接受一个函数,该函数将
List[Int]
转换为
Int
,因此我们可以使用函数
x=>x.takeRight(2).根据需要求和

请注意,我们还可以将隐式类设置为泛型:

implicit class PimpMyList[T](list: List[T]) {
  def append(f: List[T] => T): List[T] = {
    list :+ f(list)
  }
}

println(List("foo", "bar", "baz").append(_.takeRight(2).reduce(_ + _))) // List(foo, bar, baz, barbaz)

您可以使用
match
对某些表达式的结果应用某些转换:

List(1,2,3) match {
  case x => x :+ x.takeRight(2).sum
}

//>> List(1, 2, 3, 5)

显示输入和预期输出的示例。如果需要追加,我建议不要使用
列表<代码>列表
s的预结束速度很快,但追加速度很慢。考虑使用<代码>向量<代码>。