为什么我的类型检查嵌套集合在这种情况下失败?

时间:2013-07-29 10:56:03

标签: scala collections instanceof

如何检查哪个实例是当前对象。具体检查它是否为Collection。

val maps = Map("s" -> 2, "zz" -> 23, "Hello" -> "World", "4" -> Map(11 -> "World"), "23333" -> true);

for(element <- maps) {
    if(element.isInstanceOf[Map]) { // error here
         print("this is a collection instance ");
    } 
    println(element);
}

2 个答案:

答案 0 :(得分:0)

如果您想检测任何Map

for(element <- maps) {
    if(element.isInstanceOf[Map[_, _]]) {
         print("this is a collection instance ")
    } 
    println(element)
}

但这不起作用,因为你检查整个元组(“s” - &gt; 2等)而不是元组的第二个元素:

for(element <- maps) {
    if(element._2.isInstanceOf[Map[_, _]]) {
         print("this is a collection instance ")
    }
    println(element._2)
}

或者使用模式匹配:

for((_, v) <- maps) {
    if(v.isInstanceOf[Map[_, _]]) {
         print("this is a collection instance ")
    }
    println(v)
}

或者更多模式匹配:

maps foreach {
    case (_, v: Map[_, _]) => println("this is a collection instance " + v)
    case (_, v)            => println(v)
}

答案 1 :(得分:0)

为了能够编译您的代码段,请将其更改为

if (element.isInstanceOf[Map[_, _]]) {

但是当你在迭代“键/值对”时,它永远不会匹配。


所以你可能想要这样的东西:迭代值:

maps.values.foreach {
  case (m: Map[_, _]) => println(s"Map: $m" )
  case x => println(x)
}

或者如果要迭代键/值对:

maps foreach {
  case (key, m: Map[_, _]) => println(s"Map: $key -> $m" )
  case (key, value) => println(s"$key -> $value")
}