Guayaba: ¿cómo combinar filtro y transformación?


Tengo una colección de Cadenas, y me gustaría convertirla en una colección de cadenas donde se eliminen todas las cadenas vacías o nulas y se recorten todas las demás.

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 forma de guayaba de combinar las dos acciones en un solo paso?

 47
Author: Sean Patrick Floyd, 2010-11-25

1 answers

En la próxima última versión(12.0) de Guayaba, habrá una clase llamada FluentIterable. Esta clase proporciona la API fluida que falta para este tipo de cosas.

Usando FluentIterable, deberías poder hacer algo como esto:

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
Author: Olivier Heidemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-08 03:59:12