Получение карты Scala из свойств Java - PullRequest
12 голосов
/ 07 января 2010

Я пытался вытащить переменные окружения в скрипт scala с помощью java Iterators и / или Enumerations и понял, что доктор Франкенштейн может претендовать на происхождение, поэтому вместо этого я взломал следующее из уродливого дерева:

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 Properties -> scala.Map), заранее спасибо; @ )

Ответы [ 5 ]

8 голосов
/ 25 февраля 2014

Скала 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)
7 голосов
/ 19 января 2012

В 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 на ней.

7 голосов
/ 07 января 2010

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<Object, Object>, учитывая, что в javadocs четко указан этот ключ изначение String, но вы идете.Это приводит к тому, что неявный вариант становится менее привлекательным.В этом случае альтернатива является наиболее краткой из них.

EDIT

Scala 2.8 только что получил неявное преобразование из Properties в mutable.Map[String,String], чтоделает большую часть этого кода спорным.

4 голосов
/ 02 февраля 2011

В 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))
}
1 голос
/ 10 сентября 2013

Похоже, что в самой последней версии Scala (2.10.2 на момент написания этого ответа) предпочтительным способом сделать это является использование явного .asScala из scala.collection.JavaConverters:

import scala.collection.JavaConverters._

val props = System.getProperties().asScala

assert(props.isInstanceOf[Map[String, String]])
...