Могу ли я украсить столярный класс Гуавы
У меня есть 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()