Гуава: как совместить фильтр и преобразование?

У меня есть коллекция строк, и я хотел бы преобразовать ее в коллекцию строк, если все пустые или нулевые строки удалены, а все остальные обрезаны.

Я могу сделать это в два этапа:

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]

Но есть ли способ объединения двух действий в один шаг в Гуаве?


person Sean Patrick Floyd    schedule 25.11.2010    source источник
comment
как отмечает Скаффман, это самый простой способ сделать это; Что касается вашего примечания о том, что некоторые довольно часто используемые функции не запекаются - почему бы не попросить Strings API добавить несколько статических Function и Predicate для разумных примеров, подобных этому? Я нашел сопровождающих по адресу code.google.com/p/guava-libraries. /issues/list достаточно отзывчивы.   -  person Carl    schedule 25.11.2010
comment
@Карл, у меня уже есть проблемы в конвейере code.google.com/p/guava-libraries/issues/, и я не хочу действовать им на нервы. Но я мог бы просто сделать это, потому что в конечном итоге я хотел бы, чтобы Guava заменила для меня commons/lang и commons/io, и для этого ему еще предстоит пройти долгий путь.   -  person Sean Patrick Floyd    schedule 25.11.2010
comment
Я думаю, вы могли бы фильтровать, а затем трансформировать. Так что не нужно проверять нулевой регистр в вашем преобразовании   -  person sly7_7    schedule 26.11.2010
comment
@sylvain: правда, очевидно. Спасибо   -  person Sean Patrick Floyd    schedule 26.11.2010


Ответы (1)


В предстоящей последней версии (12.0) Guava будет класс с именем FluentIterable. Этот класс предоставляет отсутствующий свободный API для такого рода вещей.

Используя FluentIterable, вы сможете сделать что-то вроде этого:

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();
person Olivier Heidemann    schedule 26.04.2012
comment
Обратите внимание, что если вы используете Java 8, использование FluentIterable не рекомендуется в пользу потоков Java 8. - person Wim Deblauwe; 06.12.2016
comment
Очень ловко. Рад, что наткнулся на это. - person Mr. Polywhirl; 22.12.2016