高阶函数,fn作为参数vs调用单例对象方法

时间:2016-12-06 09:06:58

标签: scala apache-spark-sql higher-order-functions

我正在尝试使用高阶函数删除一些重复的代码。

这与调用Singleton Object方法有何不同?

示例代码:

filterDFForPaymentType(filterDF, df, "Manual")
filterDFForPaymentType(filterDF, df, "Electronic")

def filterDFForPaymentType(fn: (DataFrame, String) => DataFrame, df: DataFrame, paymentType: String) {
      fn(df, paymentType)
}

def filterDF(df: DataFrame, paymentType: String): DataFrame = {
      val filteredDF = df.where(col("paymenttypecol") === paymentType)
      filteredDF
}

这与使用Singleton对象方法调用相同函数有何不同。

filterDFForPaymentType(UtilClass.filterDF(df, "Manual"))
filterDFForPaymentType(UtilClass.filterDF(df, "Electronic"))

我确信我们可以使用高阶函数做更多事情,但我真的不明白这一点。

这是使用高阶函数的正确方法吗?

有人可以通过示例向我提供正确使用高阶函数的链接吗?

1 个答案:

答案 0 :(得分:2)

你在这里使用的filterDFForPaymentType函数除了返回你的其他函数的结果之外什么都不做,在这种情况下代码可以缩短为

filterDF(df, "Manual")
filterDF(df, "Electronic")
def filterDF(df: DataFrame, paymentType: String): DataFrame = {
      val filteredDF = df.where(col("paymenttypecol") === paymentType)
      filteredDF
}

高阶函数在它们自身实现某些逻辑的情况下是有用的(即在集合中解构和构造集合),同时使用传入的函数作为其一部分。在可选地使用传入函数的情况下,可能存在性能差异。