13

我试图使用 java Iterators 和/或 Enumerations 将环境变量拉入 scala 脚本,并意识到 Frankenstein 博士可能声称是父母,所以我从丑陋的树中破解了以下内容:

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 gem(即 java Properties --> scala.Map),在此先感谢;@)

4

6 回答 6

8

斯卡拉 2.10.3

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)
于 2014-02-25T14:36:43.927 回答
7

斯卡拉 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 上的可变映射。从好的方面来说,如果您转换回地图,您将获得原始对象。

现在,我不知道为什么Propertiesimplements Map<Object, Object>,因为 javadocs 明确指出 key 和 value 是String,但是你去。必须对 this 进行类型转换使得隐式选项的吸引力大大降低。在这种情况下,替代方案是其中最简洁的。

编辑

Scala 2.8 刚刚获得了从Propertiesto的隐式转换mutable.Map[String,String],这使得大部分代码没有意义。

于 2010-01-06T21:43:38.810 回答
7

在 Scala 2.9.1 中,这是通过 collection.JavaConversions._ 中的隐式转换来解决的。其他答案使用不推荐使用的功能。详细信息记录在这里。这是该页面的相关片段:

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} 

从可变映射到不可变映射只需调用 toMap 即可。

于 2012-01-19T19:14:20.053 回答
4

在 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))
}
于 2011-02-02T18:08:47.080 回答
2

在 Scala 2.13.2 中:

import scala.jdk.javaapi.CollectionConverters._

val props = asScala(System.getProperties)
于 2020-06-16T19:46:36.830 回答
1

看起来在 Scala 的最新版本(截至本答案时为 2.10.2)中,执行此操作的首选方法是使用显式.asScalafrom scala.collection.JavaConverters

import scala.collection.JavaConverters._

val props = System.getProperties().asScala

assert(props.isInstanceOf[Map[String, String]])
于 2013-09-10T11:25:08.683 回答