Different types in Map Scala

后端 未结 7 1660
情书的邮戳
情书的邮戳 2020-12-14 03:11

I need a Map where I put different types of values (Double, String, Int,...) in it, key can be String.

Is there a way to do this, so that I get the correct type with

7条回答
  •  一生所求
    2020-12-14 03:28

    I don't think there's a way to get bare map.apply() to do what you'd want. As the other answers suggest, some sort of container class will be necessary. Here's an example that restricts the values to be only certain types (String, Double, Int, in this case):

    sealed trait MapVal
    case class StringMapVal(value: String) extends MapVal
    case class DoubleMapVal(value: Double) extends MapVal
    case class IntMapVal(value: Int) extends MapVal
    
    val myMap: Map[String, MapVal] =                                                               
      Map("key1" -> StringMapVal("value1"),
          "key2" -> DoubleMapVal(3.14),
          "key3" -> IntMapVal(42))
    
    myMap.keys.foreach { k =>
      val message =
        myMap(k) match { // map.apply() in your example code
          case StringMapVal(x) => "string: %s".format(x)
          case DoubleMapVal(x) => "double: %.2f".format(x)
          case IntMapVal(x) => "int: %d".format(x)
        }
      println(message)
    }
    

    The main benefit of the sealted trait is compile-time checking for non-exhaustive matches in pattern matching.

    I also like this approach because it's relatively simple by Scala standards. You can go off into the weeds for something more robust, but in my opinion you're into diminishing returns pretty quickly.

提交回复
热议问题