Groovy中的内联条件映射文字

时间:2016-07-30 18:08:53

标签: groovy

使用Groovy中的Maps / JsonBuilder处理一些翻译/映射功能。

是否可以(无需在地图文字创建之外创建额外代码)..有条件地包含/排除某些键/值对?下面的一些事情......

 def someConditional = true   

 def mapResult = 
        [
           "id":123,
           "somethingElse":[],
           if(someConditional){ return ["onlyIfConditionalTrue":true]}
        ]

预期结果: 如果someConditional如果为false,则mapResult中只存在2个键/值对。

如果someConditional如果为true,则所有3个键/值对都将存在。

请注意,如果我创建方法/并将事情分开,我确信它可以完成..为了保持简洁,我希望将内容保留在地图创建中。

4 个答案:

答案 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"]
相关问题