如果选项包含无或包含不需要的类型,则以惯用方式返回无

时间:2018-06-09 10:00:24

标签: scala

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

这是我的工作代码,但是对于嵌套匹配并在解包后将对象重新包装在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
  }
}

是否有更好,更惯用的方法来实现这一目标?

2 个答案:

答案 0 :(得分:5)

使用mapcollect即可

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

答案 1 :(得分:3)

在这种特殊情况下,您可以使用.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
}