2012-03-26 16 views
0

Ich muss die folgende Java-Methode in Scala konvertieren und habe Schwierigkeiten, weil Scala Ihnen nicht erlaubt, Werte in der Mitte der Methoden zurückgeben. Könnte mir jemand eine Hand geben oder zumindest ein Anfang, wie dies zu konvertieren:Convert Java-Methode in Scala-Methode

public boolean isAllowed(String method, String path, Map<String,String> apiUrlMap) { 

    if (apiUrlMap != null) { 
     Set<Entry<String, String>> apiSet = apiUrlMap.entrySet(); 

     for (Entry<String, String> apiUrl : apiSet) { 
      String aUrl = apiUrl.getKey(); 
      String aMeth = apiUrl.getValue(); 
      if (aUrl.equals("#")) { 
       if (aMeth.contains(method)) { 
        return true; 
       } 
      } 

      if (aUrl.endsWith("#")) { 
       String testUrl = aUrl.replaceFirst("/#", ""); 
       if (path.startsWith(testUrl)) { 
        if (aMeth.contains(method)) { 
         return true; 
        } 
       } 
      } 

      if (aUrl.equals(path) || path.equals(aUrl +"/")) { 
       if (aMeth.contains(method)) { 
        return true; 
       } 
      } 

     } 
    } 

    return false; 
} 
+0

"... weil scala es nicht erlaubt, Werte in der Mitte von Methoden zurückzugeben" - Warum denkst du das? Das Schlüsselwort return gibt es auch in Scala. – Jesper

+0

Ich denke, es tut, fing gerade an, scala zu lernen und sah keine Beispiele mit tatsächlichen Rückkehranweisungen. Zugegeben, ich wette, es gibt einen besseren Weg, dies neben dieser sehr imperativen Java-Art zu tun? – chiappone

+0

Wenn Sie IntelliJ verwenden, können Sie einfach den Java-Code einfügen und in Scala konvertieren. Unidiomatic Scala, aber es sollte funktionieren und Sie können es als Basis verwenden. –

Antwort

4

schnell geht an ihn (nicht getestet) Mit

def isAllowed(method:String, path:String, apiUrlMap:Map[String,String]) = 
    apiUrlMap exists { case (aUrl, aMeth) => { 
     aUrl.equals("#") || 
     aUrl.endsWith("#") && path.startsWith(aUrl.replaceFirst("/#", "")) || 
     (aUrl.equals(path) || path.equals(aUrl +"/")) 
     } && aMeth.contains(method) 
    } 
+0

Schön. Wird der "Fall" nur verwendet, um aussagekräftige Namen auf "Pair._1" und "Pair._2" zu erhalten, oder führt er auch eine andere Funktion aus? –

+0

@Ed der Fall wird nur verwendet, um das Paar zu dekonstruieren (Muster übereinstimmen), keine andere Funktion – hbatista

7

Scala macht Sie lassen zurückkehren, es ist nur nicht Stil empfohlen.

Zum Beispiel arbeitet die folgende fein:

def f(x: Int): String = { 
    if(x > 5) 
    return "greater" 
    else 
    return "less" 
} 

Einen Haken ist, dass Scala Sie erfordert einen expliziten Rückgabetyp angegeben hat, wenn Sie das return Schlüsselwort verwenden.

Die bessere Art wäre, einfach hat den if-Ausdruck der letzte Ausdruck des Verfahrens sein:

def f(x: Int): String = { 
    if(x > 5) 
    "greater" 
    else 
    "less" 
} 
+0

Danke, haben Sie ein Beispiel für eine Scala empfohlene Möglichkeit, dies zu tun? – chiappone

+2

@chiappone bearbeitet. Sie sollten versuchen, Ihre Methode neu zu schreiben und nur Fragen zu stellen, wenn Sie Probleme haben. Versuchen Sie, Ihre Fragen spezifisch zu formulieren und vermeiden Sie es, viel Code zu veröffentlichen, da es schwieriger ist, genau zu sagen, wo Ihr Problem liegt. – dhg

1

Die Idee In Scala ist der Funktionsaufruf anstelle der Kontrollstruktur zu verwenden. Hier ist ein (schnell geschriebenes) Beispiel:

def isAllowed(
    method: String, 
    path: String, 
    apiUrlMap: Option[Map[String, String]]) = 

    apiUrlMap flatMap {m => 
    m collectFirst { 
     case ("#", aMeth) 
      if aMeth contains `method` => 
     true 
     case (aUrl, aMeth) 
      if (aUrl endsWith "#") && 
      (path startsWith aUrl.replaceFirst("/#", "")) && 
      (aMeth contains `method`) => 
     true 
     case (`path`, aMeth) 
      if (aMeth contains `method`) => 
     true 
     case (aUrl, aMeth) 
      if (path == aUrl + "/") && 
      (aMeth contains `method`) => 
     true 
    } 
    } getOrElse false