13

Java Iterators や Enumerations を使用して環境変数を 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 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

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]])

もちろん、冗長性は、いくつかのインポートで減らすことができます。まず、Map2.8では変更可能なマップになることに注意してください。明るい面として、マップを元に戻すと、元のオブジェクトが取得されます。

さて、 javadocsがキーと値がであると明確に述べていることを考えると、なぜProperties実装するのかわかりませんが、そこに行きます。これを型キャストする必要があると、暗黙のオプションの魅力が大幅に低下します。これが事実である場合、代替案はそれらの中で最も簡潔です。Map<Object, Object>String

編集

PropertiesScala 2.8は、からへの暗黙の変換を取得したばかり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

asScalaMap(m : java.util.Map[A, B])Scala 2.8.1では、より簡潔な方法でそれを行うことができます。

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 に答える