在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" })