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)