假设我要将Option[(Int, String)]
类型的可选条目添加到Map[Int, String]
def foo(oe: Option[(Int, String)], map: Map[Int, String]) = oe.fold(map)(map + _)
现在我想知道如何添加几个可选条目:
def foo(oe1: Option[(Int, String)],
oe2: Option[(Int, String)],
oe3: Option[(Int, String)],
map: Map[Int, String]): Map[Int, String] = ???
你会如何实现它?
答案 0 :(得分:2)
map ++ Seq(oe1, oe2, oe3).flatten
答案 1 :(得分:2)
正如我在上面的评论中提到的,Scala提供了一个隐式转换(option2Iterable
),允许您在集合中其他类型的上下文中使用Option
作为一个或零个对象的集合库。
这有一些恼人的后果,但它确实为您的操作提供了以下很好的语法:
def foo(oe1: Option[(Int, String)],
oe2: Option[(Int, String)],
oe3: Option[(Int, String)],
map: Map[Int, String]): Map[Int, String] = map ++ oe1 ++ oe2 ++ oe3
这是有效的,因为++
上的Map
需要GenTraversableOnce[(A, B)]
,而Iterable
获得的option2Iterable
是GenTraversableOnce
的子类型}。
这种方法有很多变化。例如,你也可以写map ++ Seq(oe1, oe2, oe3).flatten
。我觉得不太清楚,它涉及创建一个额外的集合,但如果你喜欢它,那就去吧。
答案 2 :(得分:0)
如果可选条目的数量是可变的,我将使用可变长度参数
def foo(map: Map[Int, String], os: Option[(Int, String)]*) = map ++ os.flatten