У меня есть вопрос об упрощении кода обработки Коллекции при использовании Google Collections ( обновление : Гуава ).
У меня есть куча "компьютерных" объектов, и я хочу получить коллекцию их "идентификаторов ресурсов". Это делается так:
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()
может возвращать ноль (и изменение, которое сейчас не является опцией), но в этом случае я бы хотел опустить нули из результирующей коллекции 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 Collections