使用Google Collections時,我有一個關於簡化某些收集處理代碼的問題(更新: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();
}
}));
現在,getResourceId()
可能返回null(和不斷變化的,是不是現在的選項),但在這種情況下,我想從所得到的字符串集合忽略空值。
這裏的過濾空出一個辦法:
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收藏集),您是否可以使用Google Collections以更簡短或更優雅的方式完成同樣的事情?
不錯 - 爲什麼我從來沒有發現Predicates方法... –
優秀的建議,謝謝!使用Predicates.notNull()並將函數放入常量中的確可以很好地闡明代碼。 – Jonik
太棒了:)。當我使用函數作爲轉換時,我喜歡用靜態方法將它分離並將其命名爲XXX(),我發現它很容易閱讀。在這種情況下,它可能是:transform(matchingCompters,intoResourceId())。 –