J'ai une question à propos de la simplification de certaines Collection de code de traitement, lors de l'utilisation de Google Collections (mise à jour: Goyave).
J'ai un tas de "Ordinateur" objets, et je veux terminer avec une Collection de leurs "id de ressource". C'est fait comme suit:
Collection<Computer> matchingComputers = findComputers();
Collection<String> resourceIds =
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
}));
Maintenant, getResourceId()
peut retourner la valeur null (et un changement qui n'est pas une option à l'heure actuelle), mais dans ce cas je voudrais d'omettre les valeurs null de la Chaîne résultante de la collection.
Voici un moyen de filtrer les valeurs null:
Collections2.filter(resourceIds, new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
Vous pourriez mettre tout ça ensemble comme ceci:
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;
}
});
Mais ce n'est guère élégant, encore moins lisible, pour une tâche simple! En fait, plain old Java code (avec pas de fantaisie, Prédicat ou de la Fonction des choses à tous) serait sans doute beaucoup plus propre:
Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
String resourceId = computer.getResourceId();
if (resourceId != null) {
resourceIds.add(resourceId);
}
}
À l'aide de la ci-dessus est certainement aussi une option, mais de la curiosité (et le désir d'apprendre plus de Google Collections), pouvez-vous faire exactement la même chose dans certains plus courte ou plus de manière élégante à l'aide de Google Collections?