假设我有三个带有对象的列表
List<String> list1, list2, list3
什么是检查它们是否为空并执行某些操作的最佳方法?
到目前为止,我想到了以下方式:
if ([list1, list2, list3].any()) {
// do some action
}
但是有没有一种方法可以完全省略if
语句块呢?
假设我有三个带有对象的列表
List<String> list1, list2, list3
什么是检查它们是否为空并执行某些操作的最佳方法?
到目前为止,我想到了以下方式:
if ([list1, list2, list3].any()) {
// do some action
}
但是有没有一种方法可以完全省略if
语句块呢?
我认为没有比
更好的东西了if (list1 || list2 || list3) {
}
您想要一种类似于NotEmptyPredicate(l1, l2, l3).ifMatch { println 'hi' }
的功能,但是标准库中并不存在。创建一个不值得。
[list1, list2, list3]
比(list1 || list2 || list3)
更加灵活多用。 - lapotsdef lists = [list1, list2, list3]
中,然后可以执行if (lists.any())
。如果我需要添加其他列表检查,只需将其添加到lists
中,如def lists = [list1, list2, list3, list4]
,但整个if
不会改变。如果我在if
块中添加其他检查(不仅仅是||),那么代码将更简洁。 - lapotsitem.addKeyItems(KEY, list1, list2, list3)
吗? - tim_yatesJava
为主要设计语言的。重新组织它可能会得到更好的结果。我只是在使用Groovy重构Java代码。因为目前addKeyItems
被定义为addKeyItems(String type,List <Item> list1,List <Item> list2,List <Item> list3)
。 - lapots你问题中的一个客观部分是关于省略 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" })
if (CollectionUtils.isNotEmpty(list1) || ...)
- lapotsOptional.of((a + b + c)[0]).ifPresent { println 'not empty' }
,但是这种写法不太好看,也不会更短。 - tim_yates[list1,list2,list3] .findAll() .each { ... }
就是你要找的。 - jalopabaitem.addKeyItems(KEY, list1, list2, list3)
这样的操作,因此each
在这里无法使用。 - lapots