有没有一种优雅的方法可以在使用番石榴转换集合时删除空值?
2022-08-31 16:34:28
我有一个关于在使用Google Collections时简化一些Collection处理代码的问题(更新:Guava)。
我有一堆“计算机”对象,我想最终得到他们的“资源ID”的集合。这是这样完成的:
Collection<Computer> matchingComputers = findComputers();
Collection<String> resourceIds =
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
}));
现在,可能会返回null(现在更改它不是一个选项),但是在这种情况下,我想从生成的String集合中省略null。getResourceId()
以下是过滤掉空值的一种方法:
Collections2.filter(resourceIds, new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
你可以把所有这些放在一起,就像这样:
Collection<String> resourceIds = Collections2.filter(
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
})), new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
但对于如此简单的任务,这很难说是优雅的,更不用说可读性了!事实上,普通的旧Java代码(根本没有花哨的谓词或函数的东西)可以说会更干净:
Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
String resourceId = computer.getResourceId();
if (resourceId != null) {
resourceIds.add(resourceId);
}
}
使用上述内容当然也是一种选择,但是出于好奇心(并希望更多地了解Google Collections),您可以使用Google Collections以更短或更优雅的方式做同样的事情吗?