假设:
val personsOpt:Option[List[Person]] = ???
我更喜欢:
persons = personsOpt.fold(List[Person]()){person => person}
对此:
persons = personsOpt.getOrElse(List[Person]())
出于类型安全原因。例如,这不编译:
persons = personsOpt.fold(Nil){person => person}
是否有一种简单的方法可以获得类型安全但没有{person => person}
?
编辑:现在具体理解两件事:
getOrElse
,没有什么是非类型安全的。例如,这不会编译:{{1}} personsOpt.getOrElse("")
是Nil
,如果无法推断其类型,编译器会要求您明确。因此,使用List()
我现在无法找到该链接,但我(错误地)认为Nil
在某种程度上比使用getOrElse
fold
更不安全。
答案 0 :(得分:5)
identity
中定义了函数Predef
:
persons = personsOpt.fold(List[Person]())(identity)
我觉得这比使用getOrElse
的可读性低得多,使用它并不会使您的代码比使用getOrElse
更安全。请注意,将Nil
传递给getOrElse
会使其返回正确的类型:
scala> case class Person(name: String)
scala> val personsOpt:Option[List[Person]] = None
personsOpt: Option[List[Person]] = None
scala> val persons = personsOpt.getOrElse(Nil)
persons: List[Person] = List()
请注意,persons
是List[Person]
。