Могу ли я украсить столярный класс Гуавы

У меня есть List<String>, и мы используем Joiner для получения разделенного запятыми представления этого списка, но теперь нам нужно немного улучшить, нам нужно использовать значения в списке. Теперь код был -

String str = Joiner.on(',').skipNulls().join(myValueList);

Но теперь, когда мне нужно загладить строки, присутствующие в значениях, мне нужно сначала выполнить ее итерацию, а затем перейти к Joiner, чтобы присоединиться, но я не думаю, что это хороший подход, поскольку он будет перебирать список дважды, один для капитализации, а затем Joiner будет итерации для Join.
Есть ли какой-либо другой метод утилиты, который я пропускаю, что может сделать это на одной итерации.

Как вы это сделаете с Guava?

Ответы

Ответ 1

Вы можете использовать Iterables.transform()

Iterable<String> upperStrings = Iterables.transform(myValueList, new Function<String,String>() {
  public String apply(String input) {
    // any transformation possible here.
    return (input == null) ? null : input.toUpperCase();
  }
});
Str str = Joiner.on(',').skipNulls().join(upperStrings);

Ответ 2

Об утверждении Йоахима Зауэра:

его можно сделать намного менее подробным, если вы переместите функцию в место ее повторного использования, в Гуаве типичным сценарием будет использование перечисления:

public enum StringTransformations implements Function<String, String>{
    LOWERCASE{

        @Override
        protected String process(final String input){
            return input.toLowerCase();
        }
    },
    UPPERCASE{
        @Override
        protected String process(final String input){
            return input.toUpperCase();
        }
    }
    // possibly more transformations here
    ;

    @Override
    public String apply(final String input){
        return input == null ? null : process(input);
    }

    protected abstract String process(String input);

}

Теперь код клиента выглядит следующим образом:

String str =
    Joiner
        .on(',')
        .skipNulls()
        .join(
            Iterables.transform(myValueList,
                StringTransformations.UPPERCASE));

Которое я бы назвал гораздо более удобочитаемым.

Конечно, было бы еще лучше (с точки зрения использования памяти и производительности), если бы вы ввели константу для своего Joiner:

private static final Joiner COMMA_JOINER = Joiner.on(',').skipNulls();

// ...

String str = COMMA_JOINER.join(
            Iterables.transform(myValueList,
                StringTransformations.UPPERCASE));

Ответ 3

Как насчет следующего?

Joiner.on(',').skipNulls().join(myValueList).toUpperCase()