Groovy列表转换

ncl*_*ncl 3 groovy

我在groovy中遇到一个问题,试图弄清楚如何将单个项目转换为列表.我有一个传入变量params.contacts,它可以是单个值(例如14),也可以是值数组(例如14,15).我想把它变成一个列表.以前,我只是说params.contacts.toList(),但是这个代码在单个项目时失败了.它将取值14并将其分成[1,4]列表.

是否有一种简单,优雅的方式来处理这个问题?

Ted*_*eid 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)
Run Code Online (Sandbox Code Playgroud)

这样做的一个问题是它会完全平整事物,因此它不是一个好方法,因为它会使列表中的列表变平:

assert [[1, 2], [3, 4]] == asList([[1, 2], [3, 4]])  // fails!
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用类型系统:

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!
Run Code Online (Sandbox Code Playgroud)

在这里,我们让类型系统为我们做所有繁重的工作.如果我们已经有了收藏品,那就回去吧.否则,将其变为列表.我们仍然可以在常规中使用来自Java的这样的技巧,并且当它们对问题是正确的时候我们不应该完全抛弃它们.