在Scala中使用具有泛型类型的lambda

时间:2016-08-11 10:23:41

标签: scala function generics lambda

$base_url的第二个参数是一个具有复杂参数的函数:

myFunc

我需要将第二个参数传递给def myFunc(list : List[String], combine: (Map[String, ListBuffer[String]], String, String) => Unit) = { // body of myFunc is just a stub and doesn't matter val x = Map[String, ListBuffer[String]]() list.foreach ((e:String) => { val spl = e.split(" ") combine(x, spl(0), spl(1)) }) x } ,因此它可以用于各种类型myFunc而不是特定的A, B

String, ListBuffer[String]

如何声明和调用此类构造?

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作,

def myFunc[A, B](list : List[A], combine: (Map[A, B], A, A) => Unit) = {
  val x = Map[A, B]()
  list.foreach (e => combine(x, e, e))
  x
}

广告使用它

myFunc[String, Int](List("1","2","3"), (obj, k, v) => obj.put(k, v.toInt) ) 

答案 1 :(得分:1)

您似乎想要概括正在使用的容器。你在找这样的东西吗?在这里,我们导入scala.language.higherKinds,以便我们可以使用Container,这种类型将单个类型参数作为addPair的类型参数。

import scala.language.higherKinds

def addPair[K, V, Container[_]](map: Map[K, Container[V]],
                                addToContainer: (Container[V], V) => Container[V],
                                emptyContainer: => Container[V],
                                pair: (K, V)): Map[K, Container[V]] = {
    val (key, value) = pair
    val existingValues = map.getOrElse(key, emptyContainer)
    val newValues = addToContainer(existingValues, value)

    map + (key -> newValues)
}