从Java属性获取Scala映射

从Java属性获取Scala映射,scala,collections,map,scala-java-interop,Scala,Collections,Map,Scala Java Interop,我试图使用java迭代器和/或枚举将环境变量拉入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)

我试图使用java迭代器和/或枚举将环境变量拉入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))
}
props.keySet.toList.sortWith(<\uuh).foreach{k=>
println(k+(“”*(30-k.length))+“=”+props(k))
}
请,请不要开始打磨这个t$#d,只需向我展示我确信在这种情况下存在的scala gem(即java属性-->scala.Map),提前感谢;@)

Scala 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
,因为javadocs清楚地说明键和值是
String
,但现在就到了。这使得隐式选项的吸引力大大降低。在这种情况下,备选方案是其中最简洁的

编辑


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

在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))
}
var props=asScalaMap(System.getProperties())
props.keySet.toList.sortWith(<\uuUh).foreach{k=>
println(k+(“”*(30-k.length))+“=”+props(k))
}

在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即可。

类似于Scala的最新版本(截至回答时为2.10.2),实现这一点的首选方法是使用
Scala.collection.JavaConverters
中的显式
.asScala

import scala.collection.JavaConverters._

val props = System.getProperties().asScala

assert(props.isInstanceOf[Map[String, String]])
Scala 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)
在Scala 2.13.2中:

import scala.jdk.javaapi.CollectionConverters._

val props = asScala(System.getProperties)

不,露比对我来说太酷了,我猜是Stan Lippman的C++宝石在我的书架上引起了我的注意。作为一个侧面的说明,这是我第一次做java Scala集合转换。上次我试的时候,我没有足够的经验让它工作。我不仅有机会克服我以前的失败,而且我发现这个特别的问题非常有趣,因为我发现自己时不时地仔细阅读系统属性!谢谢大牛,稍后我会仔细看看你的答案。我很高兴能激发您对这个主题的兴趣。@Daniel,我怀疑这就是我一直在寻找的宝石,这只是演员阵容的一个遗憾,特别是属性应该实现Map[String,String]。这些转换对我来说是一个伟大的发现。我要说的是,演员阵容是Java实现属性的错误,而不是Scala的错误。丹尼尔,混乱的好精灵法师打败了旧的、粗糙的、邪恶的野兽,这是Java属性的构造。抱歉,但是你的第一条评论让我想起了一个RPG…谢谢Vitalii,我看了一下AsscalMap,还有一个版本的AsscalMap,它允许从java属性实例隐式转换到Scala可变映射[String,String]。感谢更新,Daniel确实提供了对他的答案的编辑,提到了这些隐式。具有讽刺意味的是,在scala 2.10中,访问环境将更加简单,只需使用sys.env方法返回的不可变映射即可。刚刚意识到这是我要求的属性到scala映射的转换,然而Scala 2.10也有一个sys.props方法来访问系统属性。Daniels回答中的编辑是关于Scala 2.8的,它在2.9中再次更改。。。我知道这很混乱,嗨,莎拉。感谢您对该网站的贡献。我们希望StackOverflow上的答案有更多的解释,而不仅仅是发布代码。试着阅读以下内容以获得更多帮助:)这是我最好的答案。谢谢。