У меня есть вопрос об упрощении кода обработки коллекции при использовании Google Collections (обновление: Guava).
У меня есть куча объектов "Компьютер", и я хочу получить коллекцию своих "идентификаторов ресурсов". Это делается следующим образом:
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 (и изменение этого параметра сейчас не является), но в этом случае я бы хотел опустить нули из результирующей коллекции String.
Здесь один из способов фильтрации нулей:
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-код (без каких-либо причудливых свойств Predicate или Function вообще), возможно, будет намного чище:
Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
String resourceId = computer.getResourceId();
if (resourceId != null) {
resourceIds.add(resourceId);
}
}
Использование вышеизложенного, безусловно, также является вариантом, но из любопытства (и желание узнать больше о Коллекциях Google), , вы можете сделать то же самое более коротким или более элегантным способом с помощью Коллекций Google?