Scala 将选项[T]添加到向量[T]
执行此类操作的最佳实践是什么?如果Scala 将选项[T]添加到向量[T],scala,Scala,执行此类操作的最佳实践是什么?如果T是Some[T]则将T添加到Vector[T]中,否则不执行任何操作。这个丑陋的东西管用 val v: Vector[Int] = Vector(1, 2, 3) ++ Some(5).toSeq 但将一个选项转换为一个Seq远非直观。我正在考虑为向量和选项定义一个隐式,但我想知道是否有现成的东西可以使用 我希望这样的事情能奏效 val v: Vector[Int] = Vector(1, 2, 3) :+ Some(5) 但是显然向量(1,2,3
T
是Some[T]
则将T
添加到Vector[T]
中,否则不执行任何操作。这个丑陋的东西管用
val v: Vector[Int] = Vector(1, 2, 3) ++ Some(5).toSeq
但将一个选项转换为一个Seq远非直观。我正在考虑为向量
和选项
定义一个隐式,但我想知道是否有现成的东西可以使用
我希望这样的事情能奏效
val v: Vector[Int] = Vector(1, 2, 3) :+ Some(5)
但是显然向量(1,2,3)+一些(5)并没有什么错 在尝试用代码回答您的问题时,我发现(令我惊讶的是)即使在Scala 2.10-2.12中,您也不必编写
toSeq
,这要感谢option2Iterable
在Scala.Option
companion对象中定义的。此隐式转换确保选项
可用于预期的Iterable
位置,这对于向量(+
运算符来说已经足够了
以下作品:Vector(1,2,3)++Some(5)
即使在串联多个选项时,如Some(1)++Some(2)
,也不需要使用toSeq
——结果是List(1,2)
在Scala 2.13中,选项
是从IterableOnce
派生出来的,因此即使是隐式转换也没有必要。我将模式匹配它
val v: Vector[Int] = optional match {
case Some(x) => Vector(1, 2, 3) :+ x
case None => Vector(1, 2, 3)
}
选项
是由
因此,以下内容应该适用于Scala 2.13
Vector(1, 2, 3) ++ Some(5)
Vector(1, 2, 3) ++ None
// res1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 5)
// res2: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
Vector(1, 2, 3) ++ Some(5)
Vector(1, 2, 3) ++ None
// res1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 5)
// res2: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)