斯卡拉的MapLike
特质有一种方法
mapValues [C] (f: (B) ⇒ C): Map[A, C]
但是我有时想要一个不同的类型:
mapKeysAndValues [C] (f: (A, B) ⇒ C): Map[A, C]
有没有一种简单的方法可以做到这一点呢?当然,这可以折叠完成。
斯卡拉的MapLike
特质有一种方法
mapValues [C] (f: (B) ⇒ C): Map[A, C]
但是我有时想要一个不同的类型:
mapKeysAndValues [C] (f: (A, B) ⇒ C): Map[A, C]
有没有一种简单的方法可以做到这一点呢?当然,这可以折叠完成。
Answers:
map
方法遍历所有(key, value)
对。您可以像这样使用它:
val m = Map("a" -> 1, "b" -> 2)
val incM = m map {case (key, value) => (key, value + 1)}
case
在这里能实现什么?
{case (key, value) => ...}
在这种情况下,@ Omnipresent 只是模式匹配。map
我没有给a 提供功能,而是给它提供了部分功能。
case
可以将类型放入模式中,但这并不安全,因为它可能会导致运行时错误(因为这只是模式匹配)。同时,如果您曾经更改map
函数下方的集合结构,以致于对象解释的对象太少或太多(key, value)
,那么我再次希望您会遇到运行时错误。:(
这段代码呢:
val m = Map(1 -> "one", 2 -> "two")
def f(k: Int, v: String) = k + "-" + v
m map {case (k, v) => (k, f(k, v))}
产生:
Map(1 -> 1-one, 2 -> 2-two)
可以打包成实用程序方法:
def mapKeysAndValues[A,B,C](input: Map[A,B], fun: (A, B) => C) =
input map {case(k,v) => (k, fun(k, v))}
用法:
mapKeysAndValues(
Map(1 -> "one", 2 -> "two"),
(k: Int, v: String) => k + "-" + v
)
MapLike#transform
吗?
您可以创建一个实用程序类:
class MyMapLike[K,V](m:MapLike[K,V,_]){
def mapKeysAndValues[R](f: (K, V) => R)={
m.map{case (k,v)=> f(k,v)}
}
}
object MyMapLike{
implicit def maplike2mymaplike[K,V](ml:MapLike[K,V,_]):MyMapLike[K,V]=new MyMapLike(m)
}
import MyMapLike._
Map(1 -> "one", 2 -> "two").mapKeysAndValues(k,v=>v*k)
代码未经测试,但应该可以类似地工作。
f : (A,B) => (A,C)
,则可以简单地进行操作m.map(f.tupled)
。适用于,val f = (x: String, y: Int) => (x, y+1)
但奇怪的是,如果我用f
等效地定义,repl会抱怨def
。