Я хочу условно удалить коллекцию, если значение является заданным текстом, или null.Условно удалить ключ с картинки
Для простого примера ниже:
def map1 = [
1: "#NULL",
2: [
2.1: "some value",
2.2: "some value"
]]
assert map1.dropWhile { key, value ->
value.equals("#NULL") || value == null
} == [2: [2.1: "some value", 2.2: "some value"]]
Однако это падение, а не иметь дело с суб ключа уровня и значения. Ниже приведено одно неверное утверждение:
Есть ли способ сделать это?
Обновленный после ответа Тима Теперь ниже скрипт будет работать хорошо:
def defaultMap = [
1: "some value",
2: [
2.1: "some value",
2.2: "some value",
2.3: [
"2.3.1": "some value",
"2.3.2": " some value"
]
]
]
def replacementMap = [2: [2.4: "some other value"]]
assert defaultMap.collectEntries(replacementMap) { mapKey, mapValue ->
[mapKey, replacementMap.containsKey(mapKey) ? replacementMap[mapKey] : mapValue] // Remove default key and value pairs, if they are present in the replacement map.
// New key and value pairs in the replacement map will be preserved
}.collectEntries { mapKey, mapValue ->
switch (mapValue) {
case Map:
return [mapKey, { -> mapValue.collectEntries owner }()]
case '#NULL': // Remove key, if the value is also TEXT #NULL
return [:]
default:
[mapKey, mapValue]
}
} == [2: [2.4: 'some other value'], 1: 'some value']
Однако, если я хочу, чтобы свести на нет в подкарта, но сохранить все остальные суб карты на том же уровне, не работает должным образом:
def defaultMap = [
1: "some value",
2: [
2.1: "some value",
2.2: "some value",
2.3: [
"2.3.1": "some value",
"2.3.2": " some value"
]
]
]
def replacementMap = [2.3: '#NULL']
assert defaultMap.collectEntries(replacementMap) { mapKey, mapValue ->
[mapKey, replacementMap.containsKey(mapKey) ? replacementMap[mapKey] : mapValue] // Remove default key and value pairs, if they are present in the replacement map.
// New key and value pairs in the replacement map will be preserved
}.collectEntries { mapKey, mapValue ->
switch (mapValue) {
case Map:
return [mapKey, { -> mapValue.collectEntries owner }()]
case '#NULL': // Remove key, if the value is also TEXT #NULL
return [:]
default:
[mapKey, mapValue]
}
} == [1:'some value', 2:[2.1:'some value', 2.2:'some value', 2.3:null]]
Спасибо за ваш ответ Тим, большая часть из них отлично работает с одним сценарием, который я обновил в описании, можете ли вы еще раз взглянуть, есть ли у вас больше ввода? Цените свою помощь :) – nzsquall
У меня такое чувство, что мой код можно упростить ..... – nzsquall
Я понятия не имею, что означает ваше редактирование. Каков ожидаемый результат? –