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

3

假设我有三个带有对象的列表

List<String> list1, list2, list3

什么是检查它们是否为空并执行某些操作的最佳方法?

到目前为止,我想到了以下方式:

if ([list1, list2, list3].any()) {
    // do some action
}

但是有没有一种方法可以完全省略if语句块呢?


我想不出来。你为什么要这样做?阅读性会受到影响吧? - tim_yates
@tim_yates 嗯,我不关心可读性。我想尽可能把它变得尽可能小。顺便说一下,最初它依赖于 if (CollectionUtils.isNotEmpty(list1) || ...) - lapots
如果你使用的是Java 8,你可以这样写Optional.of((a + b + c)[0]).ifPresent { println 'not empty' },但是这种写法不太好看,也不会更短。 - tim_yates
你想要执行的操作是否应用于非空列表中的对象?如果是这样,那么也许 [list1,list2,list3] .findAll() .each { ... } 就是你要找的。 - jalopaba
在实际操作中,我会执行类似于 item.addKeyItems(KEY, list1, list2, list3) 这样的操作,因此 each 在这里无法使用。 - lapots
2个回答

2

我认为没有比

更好的东西了

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

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


我明白了。虽然我认为[list1, list2, list3](list1 || list2 || list3)更加灵活多用。 - lapots
@user1432980 更加多才多艺的方式是什么? - tim_yates
例如,如果我需要检查的列表不止这三个。将它们存储在列表def lists = [list1, list2, list3]中,然后可以执行if (lists.any())。如果我需要添加其他列表检查,只需将其添加到lists中,如def lists = [list1, list2, list3, list4],但整个if不会改变。如果我在if块中添加其他检查(不仅仅是||),那么代码将更简洁。 - lapots
@user1432980 好的,但是如果你的基础数据集扩展了,你仍然需要更改你的调用item.addKeyItems(KEY, list1, list2, list3)吗? - tim_yates
@tim_yates,问题在于该代码是以Java为主要设计语言的。重新组织它可能会得到更好的结果。我只是在使用Groovy重构Java代码。因为目前addKeyItems被定义为addKeyItems(String type,List <Item> list1,List <Item> list2,List <Item> list3) - lapots

0

你问题中的一个客观部分是关于省略 if 块。这个答案与此有关。我不建议在生产代码中使用这种方法,也不声称这是最好的方式,因为这是主观的。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接