CollectionUtils.isEmpty()和map.isEmpty()的区别
时间: 2024-05-18 08:15:05 浏览: 283
`CollectionUtils.isEmpty()`是Apache Commons Lang库中的一个方法,用于判断一个集合是否为空,如果集合为null或者长度为0,则返回true,否则返回false。而`Map.isEmpty()`是Java自带的Map接口中的一个方法,用于判断一个Map是否为空,如果Map为null或者Map中没有任何键值对,则返回true,否则返回false。
因此,`CollectionUtils.isEmpty()`可以用于判断List、Set等集合类型是否为空,而`Map.isEmpty()`则只能用于判断Map是否为空。同时,对于Map类型,也可以使用`CollectionUtils.isEmpty(map)`来判断Map是否为空,但是`Map.isEmpty()`更为直观和简洁。
相关问题
代码优化 res.add(CollectionUtils.isEmpty(typeMap.get(type)) ? 0 : typeMap.get(type).size());
这段代码的意思是:如果typeMap中类型为type的元素为空,则向res中加入0,否则将typeMap中类型为type的元素的大小加入到res中。这段代码可以进行一些优化。首先,可以将CollectionUtils.isEmpty(typeMap.get(type)) ? 0 : typeMap.get(type).size()提取为一个局部变量,以提高代码的可读性和可维护性。其次,可以使用Java 8的Optional类来简化代码,如下所示:
int size = Optional.ofNullable(typeMap.get(type)).map(Collection::size).orElse(0);
res.add(size);
这段代码与上面的代码实现的功能是相同的,但使用了Java 8的Lambda表达式和Optional类进行改写,可以让代码更加简洁和优雅。
for (DatabaseType d : dataTypes) { DatabaseContextHolder.setDatabaseType(d); List<String> bankPaidOutRefNbrs = unionLoanMapper.getCustPaidOutRefNbrsUnionLoan(); if(!CollectionUtils.isEmpty(bankPaidOutRefNbrs)){ DatabaseContextHolder.setDatabaseType(d); List<PaidOutRemainBalVo> unionBankBals = unionLoanMapper.getUnionBalByRefNbrs(bankPaidOutRefNbrs); List<String> refNbrs = unionBankBals.stream().map(p -> p.getRefNbr()).collect(Collectors.toList()); DatabaseContextHolder.setDatabaseType(d); List<String> waiveRefNbrs = new ArrayList<>(); if (!CollectionUtils.isEmpty(refNbrs)){ waiveRefNbrs = unionLoanMapper.getUnionWaiveRefNbr(refNbrs); } Iterator<PaidOutRemainBalVo> iterator = unionBankBals.iterator(); while (iterator.hasNext()) { PaidOutRemainBalVo vo = iterator.next(); //排除豁免未入账 if (!CollectionUtils.isEmpty(waiveRefNbrs)) { if (waiveRefNbrs.contains(vo.getRefNbr())) { iterator.remove(); continue; } } //去除三峡本金为负数的告警 if (vo.getCoopId() != null && vo.getCoopId().contains("SXBANK") && vo.getPrincipalBal().compareTo(BigDecimal.ZERO) < 0) { iterator.remove(); } } if (!CollectionUtils.isEmpty(unionBankBals)){ unionBalsAll.addAll(unionBankBals); } } } 用多线程实现该循环
可以使用Python内置的`concurrent.futures`模块中的`ThreadPoolExecutor`来实现多线程循环。具体代码如下:
```python
from concurrent.futures import ThreadPoolExecutor
from functools import partial
def process_data(d, data):
DatabaseContextHolder.setDatabaseType(d)
bankPaidOutRefNbrs = unionLoanMapper.getCustPaidOutRefNbrsUnionLoan()
if not bankPaidOutRefNbrs:
return []
DatabaseContextHolder.setDatabaseType(d)
unionBankBals = unionLoanMapper.getUnionBalByRefNbrs(bankPaidOutRefNbrs)
refNbrs = [p.getRefNbr() for p in unionBankBals]
DatabaseContextHolder.setDatabaseType(d)
waiveRefNbrs = unionLoanMapper.getUnionWaiveRefNbr(refNbrs) if refNbrs else []
result = []
for vo in unionBankBals:
if waiveRefNbrs and vo.getRefNbr() in waiveRefNbrs:
continue
if vo.getCoopId() and "SXBANK" in vo.getCoopId() and vo.getPrincipalBal() < 0:
continue
result.append(vo)
return result
dataTypes = [...]
with ThreadPoolExecutor(max_workers=2) as executor:
func = partial(process_data, data=dataTypes)
results = executor.map(func, dataTypes)
unionBalsAll = []
for result in results:
if result:
unionBalsAll.extend(result)
```
以上代码中,我们将原来的循环拆分成了一个`process_data`函数,并使用`partial`函数将`dataTypes`作为参数传递给该函数。接着,创建一个`ThreadPoolExecutor`实例,设置最大工作线程数为2。使用`map`方法将`process_data`函数提交给线程池,并传入`dataTypes`参数,得到一个生成器对象`results`。最后,遍历`results`并将结果存入`unionBalsAll`中。这样就实现了多线程循环。
阅读全文