Потребовалось создавать строку с разделителями — запятыми из Collection<String>.
Т.е. у нас есть
ArrayList<>(Arrays.asList("First string", "Second string", "Third string"));
А нужно получить
String resultString = "First string, Second string, Third string";
Можно олдскульно пробежаться по списку for-ом и сформировать строку, проверив, что первый элемент должен быть без запятой:
final List<String> stringListToJoin = new ArrayList<>(stringsToJoin);
final StringBuilder resultString = new StringBuilder();
for(int i=0; i < stringsToJoin.size(); i++) {
if(i != 0) {
resultString.append(delimiter).append(stringListToJoin.get(i));
} else {
resultString.append(stringListToJoin.get(i));
}
}
Но по мне так бойлерплейта многовато. Пришлось привести Collection к List чтобы получить .get(int index), а такое приведение небезопасно. Не может же быть, чтобы никто ещё этим не озадачился…
Как оказалось — кто-то озадачился! И не один!
Можно воспользоваться прелестями Java 8 и использовать StringJoiner:
final StringJoiner joiner = new StringJoiner(delimiter);
for(final String element : collectionToJoin) {
joiner.add(element);
}
Кода меньше, лишних приведений типов нет — всё как я люблю.
Если Java не 8-я, то можно использовать StringUtils.join:
StringUtils.join(collectionToJoin, delimiter);
Ещё короче код, но придётся подтянуть эту самую библиотечку StringUtils.
Все три примера доступны в моём гитхабе.
Источник знаний — англоязычный stackoverflow.