2012-03-26 2 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 не позволяет вам возвращать значения в середине методов» - Почему вы так думаете? Ключевое слово 'return' также существует в Scala. – Jesper

+0

Я предполагаю, что это так, только начал изучать scala и не видел никаких примеров с действительными операторами return. Конечно, я уверен, что есть лучший способ сделать это, кроме этого очень важного java-способа? – chiappone

+0

Если вы используете IntelliJ, вы можете просто вставить код Java и преобразовать его в Scala. Unidiomatic Scala, но он должен работать, и вы можете использовать его в качестве основы. –

ответ

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

Ницца. Используется ли «случай» для получения значимых имен на «Pair._1» и «Pair._2» или выполняет ли он какую-то другую функцию? –

+0

@ Этот случай используется только для деконструирования (совпадение паттерна) пары, никакой другой функции – hbatista

7

Scala делает позволит вам вернуться, это просто не рекомендуется стиль.

Например, следующий прекрасно работает:

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

+2

@chiappone отредактирован. вы должны попробовать переписать свой метод и просто задать вопросы, если у вас есть проблемы. постарайтесь задать свои вопросы и избегать размещения большого количества кода, поскольку это затрудняет точное определение вашей проблемы. – dhg

1

Идея в 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 
Смежные вопросы