web-dev-qa-db-fra.com

Goyave: comment combiner filtre et transformation?

J'ai une collection de chaînes et j'aimerais la convertir en une collection de chaînes si toutes les chaînes vides ou nulles sont supprimées et toutes les autres sont tronqué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 manière goyave de combiner les deux actions en une seule étape?

47
Sean Patrick Floyd

Dans le a venir dernière version (12.0) de Guava, il y aura une classe nommée FluentIterable . Cette classe fournit l'API courante 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();
80
Olivier Heidemann