2012-03-26 130 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