forEach ist eine sideEffecting-Funktion und wird über die gesamte Map iterieren. Die in ForEach übergebene Sperrung kann nicht als eine imperative While-Schleife betrachtet werden. Scala und funktionale Programmierung sind deklarativ. Sie deklarieren also nur eine Funktion, die auf jedem Tupel der Karte ausgeführt werden soll.
u=>if (u.getKey()=="parameter") return true
Dies ist eine Funktion erklärt, die ausgeführt wird (kann wie Listen durchlaufen werden Karten) jedes Element der Karte über. Das Lambda läuft auch in einem anderen Kontext als isParameterSet. Ich denke, dass das entsprechende Code-Segment zu Ihrem scala-Code ist:
def checkParameter(parameter: String, iterator: Iterator): Unit = {
if (iterator.next().getKey() == parameter)
return true
}
def isParameterSet(parameter: String): Boolean = {
//java based
val iterator = newConfig.entrySet().iterator()
while (iterator.hasNext()) {
checkParameter(parameter, iterator)
}
return false
}
Also hier die return true Affekt nicht isParameterSet seit seinem in einem anderen Kontext.
Schauen Sie sich an, wie Schließungen und Lambda-Ausdrücke funktionieren. Die Idee ist nicht Scala-spezifisch, so dass Sie die Konzepte in etwas lernen können, mit dem Sie vertrauter sind (Java 8 hat jetzt Schließungen). Diese Dinge auf einer fremden Sprache zu lernen, kann frustrierend sein.
Im Folgenden finden Sie einen Code, der sich mit der Überprüfung des Parameters befasst. Ich habe hier einige Annahmen gemacht, wo ein Nullwert bedeutet, dass ein Parameter nicht gesetzt ist. Ich habe auch versucht, meine Absichten für dich zu kommentieren. Lassen Sie uns wissen, wenn sie nicht klar
package parameter_set
// Its usually considered ideal to keep all imports at the top of the code just like in Java
import java.util
import scala.collection.JavaConverters._
object ParameterSet extends App {
val javaConfig: util.Map[String, String] = new util.HashMap[String, String]()
javaConfig.put("param1", "value1")
javaConfig.put("param2", "value2")
javaConfig.put("param3", "value3")
javaConfig.put("param4", null)
// The Option will make sense in a second
val newConfig: Map[String, String] = javaConfig
// converts it to a mutable map
.asScala
// converts it to an immutable map
.toMap
// I am a bit paranoid since this was a Java map and I need to make sure all null values are handled as Option
.mapValues(value => Option(value))
// This resolves a known issue since mapValues creates a view over the underlying Map (http://stackoverflow.com/questions/14882642/scala-why-mapvalues-produces-a-view-and-is-there-any-stable-alternatives)
.view
.force
// Now we need to only take the key -> values
.collect {
case (key, Some(value)) => key -> value
}
def isParameterSet(parameter: String): Boolean = newConfig.exists(parameters => parameters._1 == parameter)
println(isParameterSet("param2")) //true
println(isParameterSet("param7")) //false
println(isParameterSet("param4")) //false
}
Sie tun Vorsicht, wenn der Wert null ist? Im Allgemeinen möchte Scala nicht null in seinem System, aber da die newConfig eine Java-Map ist, gibt es eine Chance, dass Sie einen Wert null haben können – Jono