1

我有一个PartialFunction[String,String]和一个Map[String,String]。我想在地图值上应用部分函数并收集它适用的条目。即给出:

val m = Map( "a"->"1", "b"->"2" )
val pf : PartialFunction[String,String] = {
  case "1" => "11"
}

我想以某种方式结合_._2pf能够做到这一点:

val composedPf : PartialFunction[(String,String),(String,String)] = /*someMagicalOperator(_._2,pf)*/
val collected : Map[String,String] = m.collect( composedPf ) 
// collected should be Map( "a"->"11" )

到目前为止,我得到的最好的是:

val composedPf = new PartialFunction[(String,String),(String,String)]{
        override def isDefinedAt(x: (String, String)): Boolean = pf.isDefinedAt(x._2)
        override def apply(v1: (String, String)): (String,String) = v1._1 -> pf(v1._2)
      }

有没有更好的办法?

4

2 回答 2

4

这是神奇的运算符:

val composedPf: PartialFunction[(String, String), (String, String)] = 
  {case (k, v) if pf.isDefinedAt(v) => (k, pf(v))}

另一个选项,不创建组合函数,是这样的:

m.filter(e => pf.isDefinedAt(e._2)).mapValues(pf)
于 2016-05-16T08:16:15.170 回答
0

Scalaz 中有一个函数,正是这样做的:second

scala> m collect pf.second
res0: scala.collection.immutable.Map[String,String] = Map(a -> 11)

这是可行的,因为PartialFunction它是 Arrow(通用函数)类型类的一个实例,并且second是为箭头定义的常见操作之一。

于 2016-05-16T15:54:28.210 回答