Dax*_*xon 14 string groovy map
我有一个字符串
def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
Run Code Online (Sandbox Code Playgroud)
我想将它转换为地图
["session", 234567893egshdjchasd]
["userId", 12345673456]
["timeout", 1800000]
Run Code Online (Sandbox Code Playgroud)
这是我现在这样做的方式,
def map = [:]
data.splitEachLine("&"){
it.each{ x ->
def object = x.split("=")
map.put(object[0], object[1])
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但是有更有效的方法吗?
ig0*_*774 25
我不知道认为这会运行得更快,但它的确表现在语法简约性方面:
def data = 'session=234567893egshdjchasd&userId=12345673456&timeOut=1800000'
def result = data.split('&').inject([:]) { map, token ->
//Split at "=" and return map with trimmed values
token.split('=').with {
map[it[0].trim()] = it[1].trim()
}
map
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我喜欢Don的可读性和可维护性的答案,但根据具体情况,这可能是合适的.
编辑:这实际上是一个重新格式化的单行.
Dón*_*nal 13
我不知道这是否更有效,但对我来说,它有点简单(YMMV)
def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
def map = [:]
data.split("&").each {param ->
def nameAndValue = param.split("=")
map[nameAndValue[0]] = nameAndValue[1]
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找高效的正则表达式,那就是它所在的位置:
def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
def map = [:]
data.findAll(/([^&=]+)=([^&]+)/) { full, name, value -> map[name] = value }
println map
Run Code Online (Sandbox Code Playgroud)
打印:
[session:234567893egshdjchasd, userId:12345673456, timeOut:1800000]
Run Code Online (Sandbox Code Playgroud)
如果你不熟悉正则表达式,它可能看起来有点异国情调,但实际上并不复杂.它只有两个(组),第一组是任何字符,但是"&"或"=".第二组是除"="之外的任何字符.捕获组位于"="的两侧.