Scala 将某些值传递给具有默认参数值的函数的最佳方法?

Scala 将某些值传递给具有默认参数值的函数的最佳方法?,scala,Scala,我有一个来自第三方库的函数,如下所示: def myfunction(input:String = "some constant value") 我有一个 myinput:Option[String] 和我一起,我需要传递函数。现在,我正在这样做: myfunction(myinput.getOrElse("some constant value")) 但是我不想查看第三方库的默认值。 理想的方法是什么?我不知道这是否是最好的方法,但你可以这样做: if (myinput.isDefin

我有一个来自第三方库的函数,如下所示:

def myfunction(input:String = "some constant value")
我有一个

myinput:Option[String] 
和我一起,我需要传递函数。现在,我正在这样做:

myfunction(myinput.getOrElse("some constant value"))
但是我不想查看第三方库的默认值。
理想的方法是什么?

我不知道这是否是最好的方法,但你可以这样做:

if (myinput.isDefined){
  myfunction(myinput.get)
}
else{
  myfunction()
}
因此,如果您的
myinput
包含一个值,请使用它,否则使用默认值

显然,如果您经常这样做,您应该将其外包给一个函数,以便在每次调用时只有一行。

您可以尝试:

myinput.map(v => myfunction(v)).getOrElse(myfunction())
或更简洁(如巴勃罗在评论中所建议):


另一种方式是折叠。 假设myfunction返回我们得到的字符串:

val callIt: Option[String] => String = it => it.fold(myfunction())(myfunction(_))

callIt(None)
callIt(Some("abc"))

有很多方法可以实现这一点,但我最喜欢的方法是使用模式匹配。这段代码可读性也很强

myinput match {
     case Some(str) => myfunction(str)
     case _ => myfunction()
}

这种事情通常用
来完成。折叠

myInput.fold(myfunction())(myfunction _)

我认为这是最好的答案。它可能更简洁,因为
myfunction
只接收一个
String
参数:
myinput.map(myfunction).getOrElse(myfunction())
同意。或者让未来的评论者感到困惑,
myinput-map-myfunction uuorelse-myfunction()
如果你使用
fold
(也更惯用)@Dima我同意fold更惯用,但是,我发现大多数人觉得它更让人困惑(尤其是那些刚接触scala的人)。@AssafMendelson是的。。。如果你对某事物不熟悉,那么它越是习惯用法,你就越会感到困惑:)“大多数人”,对scala来说是新手,也会发现循环和变量“困惑”更少,然后
foreach
foldLeft
。。。这不是坚持前者的理由。。。“大多数人”可以接受教育。
myInput.fold(myfunction())(myfunction _)