使用Groovy中的Maps / JsonBuilder处理一些翻译/映射功能。
是否可以(无需在地图文字创建之外创建额外代码)..有条件地包含/排除某些键/值对?下面的一些事情......
def someConditional = true
def mapResult =
[
"id":123,
"somethingElse":[],
if(someConditional){ return ["onlyIfConditionalTrue":true]}
]
预期结果: 如果someConditional如果为false,则mapResult中只存在2个键/值对。
如果someConditional如果为true,则所有3个键/值对都将存在。
请注意,如果我创建方法/并将事情分开,我确信它可以完成..为了保持简洁,我希望将内容保留在地图创建中。
答案 0 :(得分:2)
您可以使用with
来帮助自己:
[a:1, b:2].with{
if (false) {
c = 1
}
it
}
小帮手:
Map newMap(m=[:], Closure c) {
m.with c
m
}
E.g:
def m = newMap {
a = 1
b = 1
if (true) {
c = 1
}
if (false) {
d = 1
}
}
assert m.a == 1
assert m.b == 1
assert m.c == 1
assert !m.containsKey('d')
或通过初始地图:
newMap(a:1, b:2) {
if (true) {
c = 1
}
if (false) {
d = 1
}
}
答案 1 :(得分:1)
没有这样的语法,你能做的最好的就是
def someConditional = true
def mapResult = [
"id":123,
"somethingElse":[]
]
if (someConditional) {
mapResult.onlyIfConditionalTrue = true
}
答案 2 :(得分:1)
我同意Donal,没有地图创建之外的代码很难。
至少你必须实现自己的ConditionalMap,这是一个小工作但完全可行。
每个元素都可以拥有自己的条件,如
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
CreateBackup("Server=localhost\\bekidev;Database=ApplifyAengine;Trusted_Connection=True;MultipleActiveResultSets=true",
"test",
"C:\\temp\\test.bak");
}
private static void CreateBackup(string connectionString, string databaseName, string backupFilePath)
{
var backupCommand = "BACKUP DATABASE @databaseName TO DISK = @backupFilePath";
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(backupCommand, conn))
{
conn.Open();
cmd.Parameters.AddWithValue("@databaseName", databaseName);
cmd.Parameters.AddWithValue("@backupFilePath", backupFilePath);
cmd.ExecuteNonQuery();
}
}
}
}
这是一个不完整的示例(我只做 put ,获取, keySet ,值和大小来说明,而不是键入 - 但你可能不需要类型吗?),你可能需要实现其他几个(isEmpty,containsKey等...)。
map["a"] = "A"
map["b"] = "B"
map.put("c","C", true)
map.put("d","D", { myCondition })
etc...
答案 3 :(得分:1)
您可以将所有错误条件映射到公共密钥(例如"/dev/null"
,""
等),然后在合同中删除该密钥。请考虑以下事项:
def condA = true
def condB = false
def condC = false
def mapResult =
[
"id":123,
"somethingElse":[],
(condA ? "condA" : "") : "hello",
(condB ? "condB" : "") : "abc",
(condB ? "condC" : "") : "ijk",
]
// mandatory, arguably reasonable
mapResult.remove("")
assert 3 == mapResult.keySet().size()
assert 123 == mapResult["id"]
assert [] == mapResult["somethingElse"]
assert "hello" == mapResult["condA"]