47 votes

Goyave: comment combiner filtrer et transformer?

J'ai une collection de chaînes et j'aimerais la convertir en une collection de chaînes où toutes étaient vides ou nulles. Les chaînes sont supprimées et toutes les autres sont supprimées.

Je peux le faire en deux étapes:

 final List<String> tokens =
    Lists.newArrayList(" some ", null, "stuff\t", "", " \nhere");
final Collection<String> filtered =
    Collections2.filter(
        Collections2.transform(tokens, new Function<String, String>(){

            // This is a substitute for StringUtils.stripToEmpty()
            // why doesn't Guava have stuff like that?
            @Override
            public String apply(final String input){
                return input == null ? "" : input.trim();
            }
        }), new Predicate<String>(){

            @Override
            public boolean apply(final String input){
                return !Strings.isNullOrEmpty(input);
            }

        });
System.out.println(filtered);
// Output, as desired: [some, stuff, here]
 

Mais existe-t-il une méthode goyave pour combiner les deux actions en une seule étape?

80voto

Olivier Heidemann Points 902

Dans la dernière version à venir (12.0) de goyave, il y aura une classe nommée FluentIterable . Cette classe fournit l’API couramment manquante pour ce genre de choses.

En utilisant FluentIterable, vous devriez pouvoir faire quelque chose comme ceci:

 final Collection<String> filtered = FluentIterable
    .from(tokens)
    .transform(new Function<String, String>() {
       @Override
       public String apply(final String input) {
         return input == null ? "" : input.trim();
       }
     })
    .filter(new Predicate<String>() {
       @Override
       public boolean apply(final String input) {
         return !Strings.isNullOrEmpty(input);
       }
     })
   .toImmutableList();
 

16voto

skaffman Points 197885

C’est ainsi que vous êtes censé procéder - en enchaînant les étapes de traitement.

C’est aussi simple que cela, vraiment. Cela améliorerait la lisibilité si vous extrayiez d’abord les objets Function et Predicate dans des variables distinctes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X