Scala 使用折叠选项而不使用x=>;x
鉴于: 我更喜欢:Scala 使用折叠选项而不使用x=>;x,scala,Scala,鉴于: 我更喜欢: val personsOpt:Option[List[Person]] = ??? 为此: persons = personsOpt.fold(List[Person]()){person => person} 出于类型安全原因。例如,这不会编译: persons = personsOpt.getOrElse(List[Person]()) 是否有一种简单的方法可以获得类型安全性,但不具有{person=>person} 编辑:现在有两件事已经被具体理解了: 关于
val personsOpt:Option[List[Person]] = ???
为此:
persons = personsOpt.fold(List[Person]()){person => person}
出于类型安全原因。例如,这不会编译:
persons = personsOpt.getOrElse(List[Person]())
是否有一种简单的方法可以获得类型安全性,但不具有{person=>person}
编辑:现在有两件事已经被具体理解了:
getOrElse
,没有什么是不安全的。例如,这不会编译:personopt.getOrElse(“”)
Nil
是List()
,如果不能推断出它的类型,编译器将要求您明确。因此,使用Nil
我刚才找不到链接,但我(错误地)读到
getOrElse
在某种程度上比使用带有选项的fold
的更不安全,有一个identity
函数,它在Predef
中定义:
persons = personsOpt.fold(Nil){person => person}
然而,我发现这比使用getOrElse
可读性差得多,并且使用它并不会使代码比使用getOrElse
更安全。请注意,将Nil
传递到getOrElse
将使其返回正确的类型:
persons = personsOpt.fold(List[Person]())(identity)
请注意,persons
是一个列表[persons]
有功能identity
,该功能在Predef
中定义:
persons = personsOpt.fold(Nil){person => person}
然而,我发现这比使用getOrElse
可读性差得多,并且使用它并不会使代码比使用getOrElse
更安全。请注意,将Nil
传递到getOrElse
将使其返回正确的类型:
persons = personsOpt.fold(List[Person]())(identity)
请注意,persons
是一个列表[persons]
getOrElse
在这些情况下使用是正确的,类型安全性没有区别。请注意,您的fold
示例仅无法编译,因为fold
可以返回任何类型,并且类型推断应为Nil.type
,而不是您想要的列表[Person]
类型。您可以显式键入Nil
作为List[Person]
:personopt.fold(Nil:List[Person]){Person=>Person}
Wow!(对于缺点)。我认为,如果我用错误的基本假设来回答一个问题,那就足够公平了。但这是一个问题。@ChrisMurphy同意——我认为否决票是不必要的。getOrElse
在这种情况下使用是正确的,类型安全性没有区别。请注意,您的fold
示例仅无法编译,因为fold
可以返回任何类型,并且类型推断应为Nil.type
,而不是您想要的列表[Person]
类型。您可以显式键入Nil
作为List[Person]
:personopt.fold(Nil:List[Person]){Person=>Person}
Wow!(对于缺点)。我认为,如果我用错误的基本假设来回答一个问题,那就足够公平了。“但这是一个问题。”克里斯墨菲同意——我认为没有必要投反对票。