scala:传递元组引用函数

时间:2016-12-16 14:49:51

标签: python scala apache-spark tuples pyspark

在python中我可以简单地定义一个这样的函数:

def func(lst):  
   lst[0] = lst[0] + 5  
   return lst  

这个'lst'可以将不同长度的列表作为参数。

如何使用元组在Scala中执行此操作?

注意:我正在尝试在Scala中实现一个用Python编写的Spark程序(或通用库)。在该程序中有这个函数,它将RDD中的每条记录作为参数,对它进行操作然后返回它。现在这些记录的长度可以根据调用函数的RDD而变化。

3 个答案:

答案 0 :(得分:2)

与您描述的python函数完全等效,如下所示:

 def func(list: List[Any]) =  list.headOption.map { 
  _.asInstanceOf[Int] + 5 
 } ++ list.tail

但不要这样做。键入安全性(能够在编译时确保您正在查看的数据与您期望的数据完全相同)是开始使用scala而不是python的最大原因之一。

如果你不打算使用它,为什么还要在scala中重写你的python代码呢?只需使用你拥有的东西。

答案 1 :(得分:0)

你可以这样做:

def add5ToHead(list: List[Int]) = {
  list match {
    case head :: tail => head+5 :: tail
    case l => l
  }
}

答案 2 :(得分:0)

copy方法可能非常适合您的情况:

def func1(t: (Int, Int, Int)) = t.copy(_1 = t._1 + 5)

Int类型和+5只是一个示例,您可以通过额外的参数传入值和类型。

您也可以在方法中应用PartialFunction,例如:

val partialFunc1: PartialFunction[Int, Int] = {
    case x => x + 5
}

def func1(t: (Int, Int, Int), f: PartialFunction[Int, Int]) = t.copy(_1 = f(t._1))

func1((1,2,3), partialFunc1) // output will be (6,2,3)