【问题标题】:scala: pass tuple reference to functionscala:将元组引用传递给函数
【发布时间】:2016-12-16 14:49:50
【问题描述】:

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

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

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

如何在 Scala 中使用元组?

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

【问题讨论】:

    标签: python scala apache-spark tuples pyspark


    【解决方案1】:

    与您描述的 python 函数完全等价的内容如下所示:

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

    但不要这样做。类型安全(能够在编译时确保您正在查看的数据正是您期望的类型)是选择 scala 而不是 python 的最大原因之一。

    如果您不打算使用它,为什么还要在 scala 中重写您的 python 代码?就用你所拥有的吧。

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      【讨论】:

      • 唯一的问题是 List/Tuple 的元素可以是不同的类型。所以它必须是一个元组。
      【解决方案3】:

      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)
      

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2016-08-19
        • 2019-06-19
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        相关资源
        最近更新 更多