Immer ein Scala-Map aus einem Java-Eigenschaften
War ich versucht zu ziehen Umgebungsvariablen in eine scala-Skript mit java-Iteratoren und /oder Aufzählungen und festgestellt, dass Dr. Frankenstein in Anspruch nehmen, der Abstammung, so dass ich gehackt die folgenden aus dem hässlichen Baum statt:
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())
}
Beispielsweise zu drucken, sagte der gleichen Umgebung
props.keySet.toList.sortWith(_ < _).foreach{k =>
println(k+(" " * (30 - k.length))+" = "+props(k))
}
Bitte, bitte nicht zu Polieren dieses t$#d, nur zeigen Sie mir die scala Edelstein, bin ich davon überzeugt, für diesen Fall gibt es (ich.e java-Eigenschaften --> scala.Karte), vielen Dank im Voraus ;@)
- Scala Edelstein, eh? Rubyist?
- Nein, Ruby ist zu cool für mich, denke, es war die Kopie von Stan Lippman C++ Gems auf dem Regal, der meine Aufmerksamkeit erregte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scala 2.7:
Aber das braucht etwas typecasting. Lassen Sie mich es auf Arbeit ein bisschen mehr.
Ok, das war leicht. Lassen Sie mich die Arbeit auf 2.8 jetzt...
Ausführlichkeit, natürlich, kann verringert werden, mit ein paar Importe. Zuerst von allen, beachten Sie, dass
Map
wird eine veränderliche anzeigen auf 2.8. Auf der hellen Seite, wenn Sie wieder zurück konvertieren der Karte, erhalten Sie das original-Objekt.Nun, ich habe keine Ahnung, warum
Properties
implementiertMap<Object, Object>
angesichts der Tatsache, dass die javadocs deutlich, dass Schlüssel und Wert sindString
, aber dort gehen Sie. Dass typecast dies macht die implizite option, die viel weniger attraktiv. Dies ist der Fall, die alternative ist die prägnanteste davon.BEARBEITEN
Scala 2.8 nur erworben eine implizite Konvertierung von
Properties
zumutable.Map[String,String]
, das macht die meisten des Codes irrelevant.Scala 2.10.3
In Scala 2.9.1 dieses Problem ist durch die implizite Konvertierungen im inneren Sammlung.JavaConversions._ . Die anderen Antworten verwenden veraltete Funktionen. Die details sind dokumentiert hier. Dies ist ein relevanter snippet aus der Seite:
Immer über eine veränderbare Karte, um eine unveränderliche map ist eine Frage von Berufung toMap drauf.
In Scala 2.8.1 können Sie es mit
asScalaMap(m : java.util.Map[A, B])
eine präziser Art und Weise:Sieht aus wie in der jüngsten version von Scala (2.10.2 als der Zeitpunkt, zu dem dieser Antwort), ist der bevorzugte Weg, dies zu tun ist mit der ausdrücklichen
.asScala
ausscala.collection.JavaConverters
: