【问题标题】:Get all entries having a value from List[Option] in Scala从 Scala 中的 List[Option] 中获取所有具有值的条目
【发布时间】:2013-01-17 08:59:18
【问题描述】:

是否有可能让List[Option[T]] 的所有条目都具有值?

例子:

val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)

结果:

 List[Int] = List(1, 2)

有没有一种方法可以一步完成?这是一个常见的情况,不是吗?

【问题讨论】:

    标签: scala collections functional-programming


    【解决方案1】:

    是的,您可以为此使用collect

    list.collect { case Some(x) => x }
    

    collect 采用 PartialFunction[A,B] 并将此函数应用于定义它的所有元素并丢弃其余元素。

    编辑

    正如 gpampara 正确提到的那样,对于这种情况,flatten 就足够了。如果有额外的约束和/或转换,collect 将是正确的工具。

    【讨论】:

    • 谢谢。你可以依赖 Scala,总有一种更优雅的方式 ;-)
    • 更优雅的方式是:list.flatten
    【解决方案2】:

    注意

     list.flatten
    

    也可以。

    【讨论】:

      【解决方案3】:

      你也可以使用:

      list.flatMap( x => x)
      
      scala> val a = List(None, Some(1), None, Some(2))
      a: List[Option[Int]] = List(None, Some(1), None, Some(2))
      
      scala> a.flatMap(x => x)
      res0: List[Int] = List(1, 2)
      

      有关其工作原理/原因的说明,您可以查看这篇文章:http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

      【讨论】:

      • 是的,它有效。但我不明白为什么。根据文档flatMap 必须返回Option
      • 我的错误是在Option 课程上查看flatMap,但当然我必须查看List.flatMap
      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2011-05-25
      • 1970-01-01
      • 2019-05-22
      • 2021-01-23
      • 2021-11-21
      相关资源
      最近更新 更多