【问题标题】:Idiomatically return None if Option contains None or contains unwanted type如果 Option 包含 None 或包含不需要的类型,则惯用地返回 None
【发布时间】:2018-06-09 10:00:24
【问题描述】:

我想读取一个可能为空的列表的头部,如果该头部包含特定模式,我将返回 Some(),在所有其他情况下,我想返回 None。

这是我的工作代码,但嵌套匹配和在解包后将对象重新包装在 Some() 中有点难看。

 list.headOption match{
  case None => None
  case Some(csvString) => csvString.split(',') match {
    case Array(a, b, c) => Some(Array(a, b, c))
    case _ => None
  }
}

有没有更好、更惯用的方法来实现这一点?

【问题讨论】:

    标签: scala


    【解决方案1】:

    使用mapcollect 你可以做到

    list.headOption.map(_.split(',')).collect {
      case values @ Array(a, b, c) => values
    }
    

    【讨论】:

      【解决方案2】:

      在这种特殊情况下,您可以使用.map

      list.headOption.map(_.split(','))
      

      如果你需要确保数组只有 3 个元素,你可以使用 .map.filter 的组合:

      list.headOption.map(_.split(',')).filter(_.length == 3)
      

      或者测试一个特定的模式:

      list.headOption.map(_.split(',')).filter {
        case Array(a, b, c) => true
        case _ => false
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2011-09-02
        相关资源
        最近更新 更多