代码之家  ›  专栏  ›  技术社区  ›  Don Mackenzie

从Java属性获取Scala映射

  •  12
  • Don Mackenzie  · 技术社区  · 15 年前

    我试图用Java迭代器和/或枚举将环境变量转换成Scala脚本,并意识到弗兰肯斯坦博士可能会声称亲子关系,所以我从丑陋的树中攻击了下面的内容:

    import java.util.Map.Entry
    import System._
    
    val propSet = getProperties().entrySet().toArray()
    val props   = (0 until propSet.size).foldLeft(Map[String, String]()){(m, i) =>
      val e = propSet(i).asInstanceOf[Entry[String, String]]
      m + (e.getKey() -> e.getValue())
    }
    

    例如打印相同的环境

    props.keySet.toList.sortWith(_ < _).foreach{k =>
      println(k+(" " * (30 - k.length))+" = "+props(k))
    }
    

    请,请不要着手抛光这个T$$d,只要给我展示我确信存在的Scala宝石(即Java属性-& G. Scala.map),谢谢!

    5 回复  |  直到 8 年前
        1
  •  7
  •   Daniel C. Sobral    15 年前

    斯卡拉2.7:

    val props = Map() ++ scala.collection.jcl.Conversions.convertMap(System.getProperties).elements
    

    尽管这需要一些排版。让我再做一点。

    val props = Map() ++ scala.collection.jcl.Conversions.convertMap(System.getProperties).elements.asInstanceOf[Iterator[(String, String)]]
    

    好吧,那很简单。现在让我做2.8…

    import scala.collection.JavaConversions.asMap
    val props = System.getProperties() : scala.collection.mutable.Map[AnyRef, AnyRef] // or
    val props = System.getProperties().asInstanceOf[java.util.Map[String, String]] : scala.collection.mutable.Map[String, String] // way too many repetitions of types
    val props = asMap(System.getProperties().asInstanceOf[java.util.Map[String, String]])
    

    当然,只要进口几件就可以减少冗长。首先,注意 Map 将是2.8上的可变地图。在光明的一面,如果你把地图转回去,你会得到原来的物体。

    现在,我不知道为什么 Properties 器具 Map<Object, Object> ,因为javadocs清楚地声明键和值是 String 但是你去了。这使得隐式选项的吸引力大大降低。在这种情况下,替代方案是其中最简洁的。

    编辑

    scala 2.8刚刚从 性质 mutable.Map[String,String] 这使得大部分代码都是无意义的。

        2
  •  8
  •   jencoston Sarath    8 年前

    斯卡拉2.103

    import scala.collection.JavaConverters._
    
    //Create a variable to store the properties in
    val props = new Properties
    
    //Open a file stream to read the file
    val fileStream = new FileInputStream(new File(fileName))
    props.load(fileStream)
    fileStream.close()
    
    //Print the contents of the properties file as a map
    println(props.asScala.toMap)
    
        3
  •  7
  •   iwein    12 年前

    在scala 2.9.1中,这可以通过collection.javaConversions中的隐式转换来解决。其他答案使用不推荐使用的函数。详细情况记录在案 here . 这是该页面中的相关片段:

    scala> import collection.JavaConversions._  
    import collection.JavaConversions._
    
    scala> import collection.mutable._
    import collection.mutable._
    scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3)
    jul: java.util.List[Int] = [1, 2, 3]
    scala> val buf: Seq[Int] = jul
    buf: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)
    scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2)
    m: java.util.Map[String,Int] = {hello=2, abc=1} 
    

    从可变映射到不可变映射是调用to map的问题。

        4
  •  4
  •   Vitalii Fedorenko    13 年前

    在scala 2.8.1中,您可以使用 asScalaMap(m : java.util.Map[A, B]) 以更简洁的方式:

    var props = asScalaMap(System.getProperties())
    
    props.keySet.toList.sortWith(_ < _).foreach { k =>
      println(k + (" " * (30 - k.length)) + " = " + props(k))
    }
    
        5
  •  1
  •   Erik Kaplun    11 年前

    在最新版本的scala中(从这个答案开始是2.10.2),最好的方法是使用显式 .asScala scala.collection.JavaConverters :

    import scala.collection.JavaConverters._
    
    val props = System.getProperties().asScala
    
    assert(props.isInstanceOf[Map[String, String]])