【问题标题】:Convert Java method to Scala method将 Java 方法转换为 Scala 方法
【发布时间】:2012-03-26 17:13:54
【问题描述】:

我需要将以下 java 方法转换为 scala 并且遇到困难,因为 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;
}

【问题讨论】:

  • "...因为 scala 不允许您在方法中间返回值" - 你为什么这么认为? return 关键字也存在于 Scala 中。
  • 我猜是这样,刚开始学习 scala 并没有看到任何带有实际返回语句的示例。当然,我敢打赌,除了这种非常必要的 java 方式之外,还有更好的方法吗?
  • 如果您使用 IntelliJ,您只需将 Java 代码粘贴进去,它就会将其转换为 Scala。 Unidiomatic Sc​​ala,但它应该可以工作,您可以将其用作基础。

标签: scala


【解决方案1】:

Scala确实让你回归,只是不推荐的风格。

例如,以下工作正常:

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

一个问题是,如果您使用 return 关键字,Scala 要求您明确指定返回类型。

更好的方式是简单地将 if 表达式作为方法的最后一个表达式:

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

【讨论】:

  • 谢谢你有 scala 推荐方法的例子吗?
  • @chiappone 已编辑。如果遇到问题,您应该尝试重写您的方法并发布问题。尽量使您的问题具体化并避免发布大量代码,因为这样会更难准确判断您的问题出在哪里。
【解决方案2】:

快速入门(未测试)

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)
    }

【讨论】:

  • 不错。 case 仅用于在 Pair._1 和 Pair._2 上获取有意义的名称,还是它还执行其他一些功能?
  • @Ed case 只是用来解构(模式匹配)pair,没有其他功能
【解决方案3】:

scala 中的想法是使用函数调用而不是控制结构。这是一个(快速编写的)示例:

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

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多