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!(对于缺点)。我认为,如果我用错误的基本假设来回答一个问题,那就足够公平了。“但这是一个问题。”克里斯墨菲同意——我认为没有必要投反对票。