Scala - 使用默认参数值包装函数

时间:2017-04-21 06:00:41

标签: scala override default-parameters

我正在使用库函数,该函数使用参数minPartitions的默认参数值。我有一个包装函数,我可以从中调用这个库函数。我希望我的包装函数工作的方式是 - 如果为minPartitions传递了一个值,我将在调用该函数时使用该值。否则,我将使用默认值而不传递参数。我如何在Scala中执行此操作?

def read(foo: String, minPartitions: Integer = ????): RDD[String] = {
  val rdd = sc.hadoopRDD(jobConf,
            classOf[InputFormat],
            classOf[BytesWritable],
            classOf[BytesWritable],
            minPartitions // optional - default value will be used
        ) 
}

3 个答案:

答案 0 :(得分:0)

您有几种选择:

  1. 重复使用默认值。即将minPartitions =与hadoopRDD定义中的相同值
  2. 将minPartitions设为选项[整数],然后您知道何时定义它,何时不知道。
  3. 制作两个版本的功能。
  4. 如果您有自己的逻辑默认值,或者我不关心默认值是否会在将来的某个时间点发生变化,那么我会使用选项1,否则使用选项2。

答案 1 :(得分:0)

对于可能不存在的值,Scala具有let checkstr = str => { let matches = str.match(/[\DA-Z]+/g); return matches ? Math.max.apply(Math , matches.map(match => /[A-Z]/.test(match) ? match.length : -1)) : -1 }; console.log(checkstr("a0Ba"), checkstr("a0bb"), checkstr("aa0aaBa"));的概念。

Option可以是Option[Int]Some[Int]。您可以在包装函数中使用它。

此外......使用Scala时,除非明确要求,否则请使用None代替Int

现在......一种方法是使用模式匹配

Integer

另一个是def read(foo: String, partitionsOpt: Option[Int]): RDD[String] = { partitionsOpt match { case Some(partitions) => sc.hadoopRDD( jobConf, classOf[InputFormat], classOf[BytesWritable], classOf[BytesWritable], partitions ) case None => sc.hadoopRDD( jobConf, classOf[InputFormat], classOf[BytesWritable], classOf[BytesWritable] ) } map,然后执行Option

getOrElse

答案 2 :(得分:0)

示例功能:

//you can directly define your default in the parameter list
def read(minPartitions: Integer = 123): Unit {
    println(minPartitions)
}

read(77) //prints out 77
read() //prints out 123

或者,您可以使用另一个答案中提到的Option / Some / None。

示例功能:

//in this function, you must provide an Option value to second parameter
def read(minPartitions: Option[Int]): Unit {
    println(minPartitions.getOrElse(123))
}

read(Some(77)) //prints out 77
read(None) //prints out 123

您也可以将这两个概念结合使用(将参数类型定义为选项并在参数列表中提供默认值)

希望这有帮助! :)