在Groovy中检查多个列表是否为空

在Groovy中检查多个列表是否为空,groovy,Groovy,假设我有三个对象列表 List<String> list1, list2, list3 但是有没有一种方法可以省略块呢?我认为没有比这更好的方法了 if (list1 || list2 || list3) { } 您需要某种类型的NotEmptyPredicate(l1,l2,l3).ifMatch{println'hi'},但它不存在于标准库中。创建一个是不值得的。问题的一个客观部分是关于省略if块。这个答案与此有关。我不建议将此用于生产代码,也不主张这是最好的方法,这是主观的

假设我有三个对象列表

List<String> list1, list2, list3

但是有没有一种方法可以省略
块呢?

我认为没有比这更好的方法了

if (list1 || list2 || list3) {
}

您需要某种类型的
NotEmptyPredicate(l1,l2,l3).ifMatch{println'hi'}
,但它不存在于标准库中。创建一个是不值得的。

问题的一个客观部分是关于省略
if
块。这个答案与此有关。我不建议将此用于生产代码,也不主张这是最好的方法,这是主观的

通常,可以使用映射“隐藏”if语句。(上下文是通过Groovy的元编程在
列表
上的一种新的静态方法):


我想不出来。你为什么要这么做?可读性不会受到影响吗?@tim_yates嗯,我不在乎那里的可读性。我只想让它尽可能小到最大程度。最初它依赖于
if(CollectionUtils.isNotEmpty(list1)| | |…)
的方式,您可以执行((a+b+c)[0])的
Optional.of。。。但是yuk,而不是Shorter您想对非空列表的对象执行的操作是什么?在这种情况下,可能是
[list1,list2,list3].findAll()。每个{…}
都是您要查找的。在实际操作中,我会执行类似
item.addKeyItems(KEY,list1,list2,list3)
的操作,因此
每个
都不会在那里工作。虽然我认为
[list1,list2,list3]
(list1 | | list2 | list3)
好得多versatile@user1432980以什么方式更通用?@tim_-yates为例,如果我必须检查比这三个列表更多的列表。将它们存储在列表中
def list=[list1,list2,list3]
然后我可以执行
if(lists.any())
。如果我需要添加额外的列表检查,我可以简单地将其添加到
列表中,如
def list=[list1,list2,list3,list4]
,但整个
If
不会改变。另外,如果我在
if
block(不仅| | |)@user1432980中添加额外的检查就不会那么冗长了,但是您仍然需要将调用更改为
item.addKeyItems(KEY,list1,list2,list3)
如果您的底层数据集扩展了?@tim|yates,问题是代码在
java
,,设计时考虑到
java
等。重新组织它可能会带来更好的结果。我只是在用groovy重构java代码。因为当前
addKeyItems
被定义为
addKeyItems(字符串类型,列表列表1,列表列表2,列表列表3)
if (list1 || list2 || list3) {
}
List.metaClass.static.ifNotEmpty = { List<String>... lists ->
    def resultMap = [:]

    resultMap[true] = { Closure c -> c.call() }
    resultMap[false] = { Closure c -> }

    return resultMap[lists.any()]
}
List<String> list1, list2, list3

list1 = []
list2 = null
list3 = []
list3 << "HELLO"

List.ifNotEmpty(list1, list2, list3) ({ println "test 1" })

list1 = []
list2 = null
list3 = []

List.ifNotEmpty(list1, list2, list3) ({ println "should not see this" })