Scala Seq包含对于空序列非法或未定义的方法,例如max
为了保护自己,我经常通过将序列包装在一个选项中并将空映射到None来解决问题 . 它可以这样做:
def wrap[T](s: Seq[T]): Option[Seq[T]] =
s.headOption map { _ => s }
它也可以通过模式匹配或if-else来解决 .
这些方法都不容易以流畅的方式使用,坦率地说看起来有点尴尬 .
我希望能够做到这样的事情:
someStore
.giveMeASequence
.wrapInOption map { nonEmpty:Seq[T] =>
nonEmpty.max
} map (_ + 42)
我很犹豫在Try monad中包装操作,因为可以预测和避免异常 .
我是以错误的方式解决问题了吗?
如果没有,是否有任何库方法可供我减少尴尬?
3 回答
正如我在评论中提到的,scalaz
NonEmptyList
类可能对您有所帮助 . 通过导入scalaz pimping,您可以访问toNel
方法,您可以在List
上调用该方法 . 如果此列表确实为空,则无法继续映射它 . 如果它不是空的,你确实可以映射它 . 请考虑以下示例:如果您运行此代码,它将打印
Some(45)
. 如果该列表为空,则会产生None
.如果您只想进行转换,为什么不使用if / else?
或者,您可以定义自己的
maxOpt
方法:并称之为
以同样的方式,您可以添加一个包装选项中序列的方法:
您可以通过隐式类使用安全方法扩展
Seq
: