2016-08-11 3 views
0

Ich versuche, eine Java-basierte Codezeile SCLA zu konvertieren, aber die gleiche Funktionalität nicht geetingeine äquivalente Java-Funktion in scala mit Rückgabewert Schreiben

def isParameterSet(parameter: String): Boolean = { 

//java based 

val iterator=newConfig.entrySet().iterator() 

while (iterator.hasNext()) 
{ 
    if (iterator.next().getKey()==parameter) 
    return true 

} 
return false 
} 

dies zu mehr scala Version konvertieren:

def isParameterSet(parameter: String): Boolean = { 

    import scala.collection.JavaConversions._ 


val iterator=newConfig.entrySet().foreach(u=>if (u.getKey()=="parameter") return true) 
return false 
} 

der obige Code gibt immer false zurück

+0

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

Antwort

2

mit der Funktion vorhanden ist, gibt es eine einfache Probe, ich denke, Sie bekommen die Idee wird

scala> var l = List(1,2,3,4,5) 
l: List[Int] = List(1, 2, 3, 4, 5) 

scala> l.exists(x=>x==5) 
res4: Boolean = true 
+0

Ich würde es vorziehen, dass es val statt var ist. Irgendein bestimmter Grund, var zu benutzen ?? – Rakshith

+1

Kein spezifischer Grund, und ich denke nicht, dass es für diese Frage relevant ist. –

+0

Es ist nicht relevant, aber es ist wichtig. Die Räume sind auch überall: 'List (1, 2, 3, 4, 5)' und 'l.exists (x => x == 5)' sind einfacher zu lesen –

0

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 



    } 
0

Ihr auspacken Config Objekt (root) eine Java-Karte zu bekommen, dann umwandeln, das zu einer Scala Karte, dann Test für den Parameter Schlüssel:

def isParameterSet(parameter: String): Boolean = { 

     import scala.collection.JavaConversions._ 


     mapAsScalaMap(newConfig.root().unwrapped()).contains(parameter) 
    } 
Verwandte Themen