Использование find {} на карте, где оценивается вся карта, а не каждый элемент - PullRequest
0 голосов
/ 06 октября 2018

Я создал несколько смешанных методов.Код и пример ниже:

URL.metaClass.withCreds = { u, p ->
    delegate.openConnection().tap {
        setRequestProperty('Authorization', "Basic ${(u + ':' + p).bytes.encodeBase64()}")
    }
}

URLConnection.metaClass.fetchJson = {
    delegate.setRequestProperty('Accept', 'application/json')
    delegate.connect()
    def code = delegate.responseCode
    def result = new JsonSlurper().parse(code >= 400 ? delegate.errorStream : delegate.inputStream as InputStream)
    [
            ok  : code in (200..299),
            body: result,
            code: code
    ]

}

пример использования:

new URL("$baseUrl/projects/$name").withCreds(u, p).fetchJson().find {
        it.ok
    }?.tap{
        it.repos = getRepos(it.key).collectEntries { [(it.slug): it] }
    }
}

Когда я не использую find (), мой объект, как и ожидалось, является картой сэти 3 элемента.Когда я использую, find it - это Map.Entry с ключом ok и значением true

, который выдает эту ошибку:

groovy.lang.MissingPropertyException: No such property: ok for class: java.util.LinkedHashMap$Entry
Possible solutions: key

Это произошло со мной, когда я написал этонапишите, что он рассматривался как карта итеративная и, таким образом, просматривая каждую запись, которую я впоследствии проверил.Как мне find на всю карту?Я хочу it.ok, потому что, если это правда, мне нужно нести это вперед

1 Ответ

0 голосов
/ 06 октября 2018

В Groovy SDK такого метода нет.Map.find() пробегает набор записей карты, на которой вы вызываете метод.Основываясь на ожидании, которое вы определили, я предполагаю, что вы ищете функцию, которая проверяет карту с заданным предикатом и возвращает карту, если она соответствует предикату.Вы можете добавить функцию, которая действует через Map.metaClass (поскольку вы уже добавляете методы в классы URL и URLConnection).Рассмотрим следующий пример:

Map.metaClass.continueIf = { Closure<Boolean> predicate ->
    predicate(delegate) ? delegate : null
}

def map = [
        ok  : true,
        body: '{"message": "ok"}',
        code: 200
]

map.continueIf { it.ok }?.tap {
    it.repos = "something"
}

println map

В этом примере мы ввели новый метод Map.continueIf(predicate), который проверяет, соответствует ли карта заданному предикату, и возвращает null в противном случае.Выполнение приведенного выше примера приводит к следующему выводу:

[ok:true, body:{"message": "ok"}, code:200, repos:something]

Если предикат не встречается, map не изменяется.

В качестве альтернативы, для более строгого проектирования вы могли бы сделать метод fetchJson(), возвращающий объект с соответствующими методами onSuccess() и onError(), чтобы вы могли более четко выразить добавление repos при успешном выполнениив противном случае вы можете создать ответ об ошибке.

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

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