如何从Scala中的Map [String,Any]创建Map [String,String]?

时间:2014-10-09 04:05:58

标签: scala map any

scala新手 - 如何从Map[String,String]创建Map[String, Any] Map[String,Any]的值是字符串,但我不知道如何施放或以其他方式胁迫" Any"输入" String"类型。

4 个答案:

答案 0 :(得分:3)

首先有一个Map[String, Any]是一个标志可能已经脱轨的标志,虽然没有任何代码可以查看,但我无法真正帮助你。通常,当您开始看到Any和其他超级泛型类型被推断时,Scala的类型系统会告诉您,您编写的代码并不代表您认为的含义。

如果真的想要这样做,你可以这样做:

scala> val m = Map("foo" -> 5, "bar" -> 7.6, "baz" -> "qux")
m: scala.collection.immutable.Map[String,Any] = Map(foo -> 5, bar -> 7.6, baz -> qux)

scala> m.mapValues(_.toString)
res0: scala.collection.immutable.Map[String,String] = Map(foo -> 5, bar -> 7.6, baz -> qux)

答案 1 :(得分:3)

正如您所提到的,地图中的所有值都是字符串,您只需使用asInstanceOf即可。如果您的假设不正确,您将收到运行时异常,如下所示:

$ scala
Welcome to Scala version 2.9.2 (OpenJDK 64-Bit Server VM, Java 1.7.0_55).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val m:Map[String, Any] = Map("foo" -> 5, "bar" -> 7.6, "baz" -> "qux")
m: Map[String,Any] = Map(foo -> 5, bar -> 7.6, baz -> qux)

scala> val m2: Map[String, Any] = Map("foo" -> "5", "bar" -> "7.6", "baz" -> "qux")
m2: Map[String,Any] = Map(foo -> 5, bar -> 7.6, baz -> qux)

scala> m2.asInstanceOf[Map[String, String]]
res0: Map[String,String] = Map(foo -> 5, bar -> 7.6, baz -> qux)

当所有值实际上都是String类型时,这是完美的。

scala> res0("foo")
res5: String = 5

注意你错误的假设:

scala> m.asInstanceOf[Map[String, String]]
res2: Map[String,String] = Map(foo -> 5, bar -> 7.6, baz -> qux)

scala> res2("foo")
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
    at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
    at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
    at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
    at java.lang.Thread.run(Thread.java:744)

答案 2 :(得分:0)

由编译器推断的Map[String,Any]的示例包括

val a = Map( "s" -> 1, "t" -> "w" )
a: scala.collection.immutable.Map[String,Any] = Map(s -> 1, t -> w)

IntString至少常见类型为Any

toString应用于地图中的每个值。

答案 3 :(得分:0)

正如其他人已经提到的那样,首先有一个Any的事实表明某个地方出了问题。正确的解决方案是弄清楚哪里出了问题并修复它。

但是,如果确实想要将所有值都转换为String s(这会绕过类型系统,因此你不应该你知道如何做到这一点:

val anyMap: Map[String, Any] = Map("foo" -> "bar", "baz" -> "qux")

val stringMap = anyMap.mapValues(_.asInstanceOf[String])
// => stringMap: Map[String, String] = Map(foo -> bar, baz -> qux)