我在groovy中遇到一个问题,试图弄清楚如何将单个项目转换为列表。我有一个传入变量params.contacts
,它可以是单个值(例如14),也可以是值数组(例如14,15)。我想把它变成一个列表。以前,我只是说params.contacts.toList()
,但是这个代码在单个项目时失败了。它将取值14并将其分成[1,4]列表。
有没有一种简单,优雅的方法来处理这个问题?
答案 0 :(得分:8)
一种简单的方法,将其放入列表并展平:
def asList(orig) {
return [orig].flatten()
}
assert [1, 2, 3, 4] == asList([1, 2, 3, 4])
assert ["foo"] == asList("foo")
assert [1] == asList(1)
这样做的一个问题是它会完全平整事物,所以这不是一个好方法,因为它会使列表中的列表变平:
assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]]) // fails!
另一种方法是使用类型系统:
def asList(Collection orig) {
return orig
}
def asList(orig) {
return [orig]
}
assert [1, 2, 3, 4] == asList([1, 2, 3, 4])
assert ["foo"] == asList("foo")
assert [1] == asList(1)
assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]]) // works!
在这里,我们让类型系统为我们完成所有繁重的工作。如果我们已经有了收藏品,那就回去吧。否则,将其变为列表。我们在groovy中仍然可以使用Java中的这样的技巧,当问题出现时,我们不应该完全抛弃它们。