Вопрос-ответ

Java: convert List to a join()d String

Java: преобразовать List в общую строку join()

JavaScript имеет Array.join()

js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve

Есть ли в Java что-нибудь подобное? Я знаю, что могу сам что-нибудь придумать с StringBuilder:

static public String join(List<String> list, String conjunction)
{
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String item : list)
{
if (first)
first = false;
else
sb.append(conjunction);
sb.append(item);
}
return sb.toString();
}

.. но нет смысла делать это, если что-то подобное уже является частью JDK.

Переведено автоматически
Ответ 1

String.join

В Java 8 вы можете сделать это без какой-либо сторонней библиотеки.

Если вы хотите объединить коллекцию строк, вы можете использовать метод String.join():

List<String> list = Arrays.asList("foo", "bar", "baz");
String joined = String.join(" and ", list); // "foo and bar and baz"

Collectors.joining

Если у вас есть коллекция с другим типом, отличным от String, вы можете использовать Stream API с объединяющим коллектором:

List<Person> list = Arrays.asList(
new Person("John", "Smith"),
new Person("Anna", "Martinez"),
new Person("Paul", "Watson ")
);

String joinedFirstNames = list.stream()
.map(Person::getFirstName)
.collect(Collectors.joining(", ")); // "John, Anna, Paul"

Класс StringJoiner также может быть полезен.

Ответ 2

Все ссылки на Apache Commons хороши (и это то, что использует большинство людей), но я думаю, что эквивалент Guava, Joiner, имеет гораздо более приятный API.

Вы можете выполнить простое объединение с помощью

Joiner.on(" and ").join(names)

но также легко справляться с нулевыми значениями:

Joiner.on(" and ").skipNulls().join(names);

или

Joiner.on(" and ").useForNull("[unknown]").join(names);

и (насколько я понимаю, достаточно полезный, чтобы использовать его предпочтительнее commons-lang), возможность работать с картами:

Map<String, Integer> ages = .....;
String foo = Joiner.on(", ").withKeyValueSeparator(" is ").join(ages);
// Outputs:
// Bill is 25, Joe is 30, Betty is 35

что чрезвычайно полезно для отладки и т.д.

Ответ 3

Не из коробки, но во многих библиотеках есть похожие:

Язык Commons:

org.apache.commons.lang.StringUtils.join(list, conjunction);

Spring:

org.springframework.util.StringUtils.collectionToDelimitedString(list, conjunction);
Ответ 4

На Android вы могли бы использовать класс TextUtils.

TextUtils.join(" and ", names);
java string list