2010-11-25 20 views
46

J'ai une collection de chaînes, et je voudrais le convertir en une collection de chaînes étaient tous vides ou null Les chaînes sont supprimés et tous les autres sont rognés.Goyave: comment combiner filtre et transformer?

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 est-il un moyen goyave de combiner les deux actions en une seule étape?

+0

comme des notes skaffman, qui est à peu près la façon la plus simple de le faire; quant à votre note à propos de certaines fonctions assez couramment utilisées ne sont pas cuites dans - pourquoi ne pas demander l'API 'Strings' ajouter des fonctions statiques' et 'Predicate pour des exemples sensibles comme ceci? J'ai trouvé les mainteneurs sur http://code.google.com/p/guava-libraries/issues/list raisonnablement réactifs. – Carl

+0

@Carl Eh bien, je ai déjà des problèmes dans le pipeline il http://code.google.com/p/guava-libraries/issues/list?can=2&q=reporter:sean,mostlymagic.com et je ne veux pas pour se mettre les nerfs. Mais je ferais peut-être juste cela, parce que finalement je voudrais que Guava remplace les commons/lang et les communs/io pour moi et il y a encore un long chemin à faire pour cela. –

+2

Je pense que vous pourriez filtrer, puis transformer. Vous n'avez donc pas besoin de tester le cas nul dans votre transformation. –

Répondre

77

Dans la prochaine 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 être en mesure de 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(); 
+1

Notez que si vous utilisez Java 8, l'utilisation de 'FluentIterable' est déconseillée en faveur des flux Java 8. –

+0

Très lisse. Je suis content d'être tombé sur ça. –