Карта в Groovy, как получить значение из ключа? - PullRequest
1 голос
/ 28 июня 2019

У меня есть карта

def loginEmail = [
  "abc": "abc@mail.ru",
  "cde": "cde@mail.ru"
]

Как я могу получить значение из метода?Примерно так:

def getEmail(String login){
  return loginEmail.get(login)
}

Ответы [ 4 ]

2 голосов
/ 01 июля 2019

Можно также использовать:

def loginEmail = [
        "abc": "abc@mail.ru",
        "cde": "cde@mail.ru"
    ]

def getEmail(login) {
    loginEmail."$login"
}
2 голосов
/ 29 июня 2019

Пробуя ваш код в консоли Groovy, я получаю следующую ошибку:

Exception thrown

groovy.lang.MissingPropertyException: No such property: loginEmail for class: ConsoleScript9
    at ConsoleScript9.getEmail(ConsoleScript9:7)
    at ConsoleScript9.run(ConsoleScript9:10)

Я подумал о двух вариантах преодоления этого. Вы можете передать как ключ, так и карту, чтобы вы могли вернуть соответствующее значение из метода. Примерно так:

def loginEmail = [
  "abc": "abc@mail.ru",
  "cde": "cde@mail.ru"
]

def getEmail(String login, Map<String, String> loginEmail){
  return loginEmail[login]
}

def result = getEmail("abc", loginEmail)

println(result)

Или создайте карту как свойство класса, а затем вызовите ее с помощью метода класса, например:

class TestLogin {

    static loginEmail = [
      "abc": "abc@mail.ru",
      "cde": "cde@mail.ru"
    ]

    static getEmail(String login){
      return loginEmail[login]
    }
}

TestLogin.getEmail('abc')
1 голос
/ 29 июня 2019

Ваш код должен работать, за исключением некоторых проблем с областями видимости.

В следующем примере показана рабочая реализация в сочетании с тестом spockframework .

package x.y.z

import spock.lang.Specification

class LoginLockupSpec extends Specification {

    def "test different ways to lookup email by login"() {
        given:
        def loginLookup = new LoginLookup()

        expect: 'getMail Method returns mail'
        loginLookup.getEmail('abc') == "abc@mail.ru"

        and: 'direct map access is also possible'
        loginLookup.loginEmail.abc == "abc@mail.ru"
        loginLookup.loginEmail['cde'] == "cde@mail.ru"
        loginLookup.loginEmail.get('cde') == "cde@mail.ru"
    }
}


class LoginLookup {

    def loginEmail = [
            "abc": "abc@mail.ru",
            "cde": "cde@mail.ru"
    ]

    def getEmail(String login) {
        return loginEmail.get(login)
    }
}


1 голос
/ 29 июня 2019

Я думал, что вы спрашиваете о проблеме объема в Groovy. Если да, пожалуйста, найдите ответ ниже

def val1 = "hi"  // This can't be used inside a method
val2 = "hai"  // This can be used as it is global

Итак, в вашем случае объявите карту как,

loginEmail = [
  "abc": "abc@mail.ru",
  "cde": "cde@mail.ru"
]

вместо def loginEmail. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...