Scala:如何处理多个参数,这些参数可以是零
现在我有很多参数可以是none,我想给整个表达式指定一个默认值 现在我在做一些事情,比如Scala:如何处理多个参数,这些参数可以是零,scala,option,optional-parameters,Scala,Option,Optional Parameters,现在我有很多参数可以是none,我想给整个表达式指定一个默认值 现在我在做一些事情,比如 var name: Option[String] = None var surname: Option[String] = Some("Smith") val fullName:String = { name.map { name => surname.map { surname => surname + ", " + name }.getOrElse("u
var name: Option[String] = None
var surname: Option[String] = Some("Smith")
val fullName:String = {
name.map { name =>
surname.map { surname =>
surname + ", " + name
}.getOrElse("unknown")
}.getOrElse("unknown")
}
但它有点太冗长了。我想知道一种更为惯用和优雅的处理方法是什么,理想情况下是这样的(当然是伪代码!):
或者类似的东西
(只要避免双重的。getOrElse就好了…这个怎么样
scala> val fullName = (for(n <-name;s <-surname) yield n + s).getOrElse("unknown")
fullName: String = unknown
scala>val fullName=(对于(n我发现了这种方法:
val fullname = (name, surname) match {
case (Some(x), Some(y)) => x + ", " + y
case _ => "unknonw"
}
但是它仍然有点冗长您可能想了解一些关于应用程序函子的知识,因为相同的模式可以以各种方式使用
(name |@| surname)(_ + _)
发生的事情是这样的:
(M[A] |@| M[B])(fabc) ~> M[C] //fabc is a function f: (A, B) => C
也就是说,函数f
正被提升到应用程序functorM
的领域。这尤其有用,因为它与选项
、验证
、承诺
、列表
、流
等一起工作。也就是说,正如您可能使用的表达式一样:
(name |@| surname)(_ + _)
如果名称
和姓氏
都是选项[String]
,您可以将它们切换为验证内尔[Exception,String]
或承诺[String]
,代码仍然会做完全相同的事情(适用于使用的更高种类)。这非常强大。desugared:姓氏平面图(x=>name-map(x+”,“++”)getOrElse“unknown”
@opensas这里甚至有一个“Person”示例:HTH
(name |@| surname)(_ + _)