ZeD*_*ino 24 java collections arraylist
我正在重构我编写的一些旧代码,并且我在这段代码上做了标记:
List<OcmImageData> fullImagePool = new ArrayList<>();
if (CollectionUtils.isNotEmpty(style.getTestMH())) {
fullImagePool.addAll(style.getTestMH());
}
if (CollectionUtils.isNotEmpty(style.getTrousers())) {
fullImagePool.addAll(style.getTrousers());
}
if (CollectionUtils.isNotEmpty(style.getDetailRevers())) {
fullImagePool.addAll(style.getDetailRevers());
}
if (CollectionUtils.isNotEmpty(style.getDetailCuffs())) {
fullImagePool.addAll(style.getDetailCuffs());
}
if (CollectionUtils.isNotEmpty(style.getDetailInner())) {
fullImagePool.addAll(style.getDetailInner());
}
if (CollectionUtils.isNotEmpty(style.getDetailMaterial())) {
fullImagePool.addAll(style.getDetailMaterial());
}
if (CollectionUtils.isNotEmpty(style.getComposing())) {
fullImagePool.addAll(style.getComposing());
}
...
Run Code Online (Sandbox Code Playgroud)
所以基本上我需要创建一个ArrayList,其中包含这里引用的所有列表,因为它们可以为null(它们是从一个封闭的源代码框架中提取出来的数据库,不幸的是如果他没有找到任何东西它就是null),我需要每次检查集合是否为null时将它们添加到此池中,这看起来很奇怪.
是否有库或Collection-Framework实用程序类,使我能够在不执行空安全检查的情况下将集合添加到另一个集合中?
Yas*_*shu 45
在Java 8中使用以下代码: -
Optional.ofNullable(listToBeAdded).ifPresent(listToBeAddedTo::addAll)
Run Code Online (Sandbox Code Playgroud)
listToBeAdded - 要添加元素的列表.listToBeAddedTo - 使用addAll向其添加元素的列表.
Jes*_*per 27
只需编写一个小实用程序方法:
public static <E> void addAllIfNotNull(List<E> list, Collection<? extends E> c) {
if (c != null) {
list.addAll(c);
}
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以写:
List<OcmImageData> fullImagePool = new ArrayList<>();
addAllIfNotNull(fullImagePool, style.getTestMH());
addAllIfNotNull(fullImagePool, style.getTrousers());
addAllIfNotNull(fullImagePool, style.getDetailRevers());
// ...etc
Run Code Online (Sandbox Code Playgroud)
使用Java 8:
List<OcmImageData> fullImagePool = Stream.of(style.getTestMH(), /* etc */)
.filter(Objects::nonNull)
.flatMap(l -> l.stream())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这个重构干净利落
for (OcmImageData elem : new List<OcmImageData>[] { style.getTestMH(), style.getTrousers() /* etc */}) {
if (CollectionUtils.isNotEmpty(elem)) {
fullImagePull.addAll(elem);
}
}
Run Code Online (Sandbox Code Playgroud)
要回答你原来的问题,不,你必须做自己的空检查.您可以看到Guava的方法将抛出NPE,Apache的方法明确要求输入不为null.