如何在Groovy中将查询字符串转换为Map

时间:2018-08-17 20:00:16

标签: groovy

我想用;分隔符分割以下查询字符串,然后转换为地图。这样我就可以使用密钥访问值iPhone,6s Plus和2016。

def query = type=iPhone;modelName=6s Plus;year=2016
def result = query .split(';')
println result

我要访问这样的值-result.getAt('type'), result.getAt('modelName')

我尝试了以下方法-但它没有按预期工作

Map<String,String> response = result.collectEntries{
        [
            it.type,
            it.modelName,
            it.year
        ]
    }

如何在Groovy中实现这一目标?

2 个答案:

答案 0 :(得分:2)

我知道最短的版本如下:

def query = 'type=iPhone;modelName=6s Plus;year=2016'

def map = query.tokenize(';')*.tokenize('=').collectEntries()

println map.modelName // => 6s Plus

深度算法:

  • 第一个标记化将输入字符串分成3个字符串的列表

    ['type=iPhone', 'modelName=6s Plus', 'year=2016']
    
  • 接下来,我们对列表中的每个元素调用标记化,以使用=作为两个字符串元素列表的定界符将其拆分,例如:

    [['type', 'iPhone'], ['modelName', '6s Plus'], ['year', '2016']]
    
  • 最后我们称为collectEntries()-如果未传递任何参数,则它将期望一个大小为2的列表,其中第一个元素是键,第二个元素是映射条目的值

    ['type':'iPhone', 'modelName':'6s Plus', 'year':'2016']
    
  • 最后,您可以从查询字符串中获取地图,并且可以通过键简单地访问每个地图条目。

答案 1 :(得分:0)

def x = "type=iPhone;modelName=6s Plus;year=2016"
def m = x.split(';').collectEntries{it.split('=') as List}
println m.modelName