2012-03-26 153 views
0

我需要將下面的java方法轉換爲scala並且遇到困難,因爲scala不允許您在方法中間返回值。可能有人給我一隻手或至少在如何轉換這是一個開始:將Java方法轉換爲Scala方法

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

「......因爲Scala不允許你在方法中間的返回值」 - 爲什麼你認爲呢? Scala中也有'return'關鍵字。 – Jesper 2012-03-26 17:14:58

+0

我想是的,剛開始學習scala,並沒有看到任何與實際返回語句的例子。當然,我敢打賭,除了這個非常必要的java方法之外,還有更好的方法來做到這一點? – chiappone 2012-03-26 17:18:05

+0

如果您使用IntelliJ,則只需粘貼Java代碼即可將其轉換爲Scala。 Unidiomatic Sc​​ala,但它應該可以工作,並且可以用它作爲基礎。 – 2012-03-27 02:52:15

回答

4

有它的快速去(未測試)

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

不錯。 'case'只是用來在'Pair._1'和'Pair._2'上得到有意義的名字,還是還執行其他一些功能? – 2012-03-27 01:01:48

+0

@Ed情況只是用來解構(模式匹配)對,沒有其他功能 – hbatista 2012-03-27 11:25:01

7

斯卡拉確實讓您返回時,它只是不建議風格。

例如,以下工作正常:

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

一個美中不足的是,Scala的需要你,如果你使用return關鍵字指定明確的返回類型。

更好的風格是簡單地有如果表達式是方法的最後一個表達式:

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

謝謝你有一個scala推薦的方法的例子嗎? – chiappone 2012-03-26 17:20:35

+2

@chiappone編輯。你應該嘗試重寫你的方法,如果你遇到問題,就提問。嘗試提出具體的問題並避免發佈大量代碼,因爲這會使得難以準確地確定問題出在哪裏。 – dhg 2012-03-26 17:25:35

1

的想法在斯卡拉是使用函數調用,而不是控制結構。這裏是一個(快寫)例如:

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 
相關問題