如何在Scala中向Map添加可选条目?

时间:2015-04-15 13:40:24

标签: scala fold

假设我要将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] = ???

你会如何实现它?

3 个答案:

答案 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获得的option2IterableGenTraversableOnce的子类型}。

这种方法有很多变化。例如,你也可以写map ++ Seq(oe1, oe2, oe3).flatten。我觉得不太清楚,它涉及创建一个额外的集合,但如果你喜欢它,那就去吧。

答案 2 :(得分:0)

如果可选条目的数量是可变的,我将使用可变长度参数

def foo(map: Map[Int, String], os: Option[(Int, String)]*) = map ++ os.flatten