将列表转换为 Groovy 中的地图
Transforming list to map in Groovy
我正在尝试转换字符串列表:
def description = """user:some.mail@gmail.com;groups:Team-1, Team-2
user:some.othermail@gmail.com;groups:Team-2, Team-3
user:another.mail@gmail.com;groups:Team-1, Team-3
some other text"""
description = description.split('\r\n|\n|\r').findAll { it.startsWith('user') }
变成地图,看起来像这样:
[some.mail@gmail.com: "Team-2, Team-3", some.othermail@gmail.com: "Team-2, Team-3", another.mail@gmail.com: "Team-1, Team-3"]
这样我以后可以反复获取电子邮件地址和相应的团队。
遗憾的是,使用下面的代码我只能部分实现它,而且只能实现列表中的一项。我坚持让它进入循环并获得完整结果。
def userData = [:]
userData = description[0].split(';').inject([:]) { map, token ->
token.split(':').with {
map[it[0].trim()] = it[1].trim()
}
map
}
关于如何获得包含列表中所有项目的地图,你能给我一个提示吗?
您可以在列表上使用 collectEntries
方法:
def description = """user:some.mail@gmail.com;groups:Team-1, Team-2
user:some.othermail@gmail.com;groups:Team-2, Team-3
user:another.mail@gmail.com;groups:Team-1, Team-3
some other text"""
description = description.split('\r\n|\n|\r').findAll { it.startsWith('user') }
def map = description.collectEntries {
// split "user:some.mail@gmail.com;groups:Team-1, Team-2"
def split = it.split(';')
// remove "user:" prefix
def email = split[0].split(':')[1]
// remove "groups:" prefix
def groups = split[1].split(':')[1]
// create a map entry
[(email), groups]
}
然后 运行 map.forEach {k, v -> println "key: '${k}', value: '${v}'"}
打印以下内容:(在这种情况下,到字符串的标准映射可能有点混乱)
key: 'some.mail@gmail.com', value: 'Team-1, Team-2'
key: 'some.othermail@gmail.com', value: 'Team-2, Team-3'
key: 'another.mail@gmail.com', value: 'Team-1, Team-3'
我正在尝试转换字符串列表:
def description = """user:some.mail@gmail.com;groups:Team-1, Team-2
user:some.othermail@gmail.com;groups:Team-2, Team-3
user:another.mail@gmail.com;groups:Team-1, Team-3
some other text"""
description = description.split('\r\n|\n|\r').findAll { it.startsWith('user') }
变成地图,看起来像这样:
[some.mail@gmail.com: "Team-2, Team-3", some.othermail@gmail.com: "Team-2, Team-3", another.mail@gmail.com: "Team-1, Team-3"]
这样我以后可以反复获取电子邮件地址和相应的团队。
遗憾的是,使用下面的代码我只能部分实现它,而且只能实现列表中的一项。我坚持让它进入循环并获得完整结果。
def userData = [:]
userData = description[0].split(';').inject([:]) { map, token ->
token.split(':').with {
map[it[0].trim()] = it[1].trim()
}
map
}
关于如何获得包含列表中所有项目的地图,你能给我一个提示吗?
您可以在列表上使用 collectEntries
方法:
def description = """user:some.mail@gmail.com;groups:Team-1, Team-2
user:some.othermail@gmail.com;groups:Team-2, Team-3
user:another.mail@gmail.com;groups:Team-1, Team-3
some other text"""
description = description.split('\r\n|\n|\r').findAll { it.startsWith('user') }
def map = description.collectEntries {
// split "user:some.mail@gmail.com;groups:Team-1, Team-2"
def split = it.split(';')
// remove "user:" prefix
def email = split[0].split(':')[1]
// remove "groups:" prefix
def groups = split[1].split(':')[1]
// create a map entry
[(email), groups]
}
然后 运行 map.forEach {k, v -> println "key: '${k}', value: '${v}'"}
打印以下内容:(在这种情况下,到字符串的标准映射可能有点混乱)
key: 'some.mail@gmail.com', value: 'Team-1, Team-2'
key: 'some.othermail@gmail.com', value: 'Team-2, Team-3'
key: 'another.mail@gmail.com', value: 'Team-1, Team-3'