我想阅读一个可能为空的列表的头部,如果该头部包含特定模式,我将返回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
}
}
是否有更好,更惯用的方法来实现这一目标?
答案 0 :(得分:5)
使用map
和collect
即可
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
}