2010-11-25 15 views
46

Tengo una colección de cadenas, y me gustaría convertirla en una colección de cadenas, todas vacías o nulas. Las cadenas se eliminan y todas las demás se recortan.Guava: cómo combinar filtro y transformar?

puedo hacerlo en dos pasos:

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] 

Pero hay una manera de guayaba de la combinación de las dos acciones en un solo paso?

+0

como skaffman, eso es la forma más sencilla de hacerlo; en cuanto a su nota acerca de algunas funciones muy comúnmente utilizadas que no están cocidas, ¿por qué no solicitar la API 'Strings' agregar algunas' Funciones 'estáticas y' Predicado 'para ejemplos como este? Encontré a los responsables de mantenimiento en http://code.google.com/p/guava-libraries/issues/list razonablemente receptivos. – Carl

+0

@Carl bueno, ya tengo problemas en la ruta allí http://code.google.com/p/guava-libraries/issues/list?can=2&q=reporter:sean,mostlymagic.com y no quiero para poner de sus nervios. Pero podría hacer eso, porque eventualmente me gustaría que Guava reemplace commons/lang y commons/io por mí y todavía me queda un largo camino por recorrer. –

+2

Creo que podrías filtrar y luego transformar. Por lo tanto, no es necesario que pruebe el caso nulo en su transformación –

Respuesta

77

En el próximo última versión (12.0) de Guava, habrá una clase llamada FluentIterable. Esta clase proporciona la API faltante fluida para este tipo de cosas.

Usando FluentIterable, usted debería ser capaz de hacer algo como esto: notas

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

Tenga en cuenta que si está en Java 8, se desaconseja el uso de 'FluentIterable' en favor de las secuencias Java 8. –

+0

Muy resbaladizo. Me alegro de haber tropezado con esto. –