Подтвердить что ты не робот

Предпочтительная идиома для присоединения коллекции строк в Java

Учитывая коллекцию строк, как вы можете присоединиться к ним в простой Java, не используя внешнюю библиотеку?

Учитывая эти переменные:

Collection<String> data = Arrays.asList("Snap", "Crackle", "Pop");
String separator = ", ";
String joined; // let create this, shall we?

Вот как я сделал бы это в Guava:

joined = Joiner.on(separator).join(data);

И в Apache Commons/Lang:

joined = StringUtils.join(data, separator);

Но в простой Java, действительно ли нет лучшего способа, чем это?

StringBuilder sb = new StringBuilder();
for(String item : data){
    if(sb.length()>0)sb.append(separator);
    sb.append(item);
}
joined = sb.toString();
4b9b3361

Ответ 1

Я бы сказал, лучший способ сделать это (если лучше всего вы не имеете в виду "наиболее краткий" ), не используя Guava, использует технику Guava, использующую внутренне, что для вашего примера будет выглядеть примерно так:

Iterator<String> iter = data.iterator();
StringBuilder sb = new StringBuilder();
if (iter.hasNext()) {
  sb.append(iter.next());
  while (iter.hasNext()) {
    sb.append(separator).append(iter.next());
  }
}
String joined = sb.toString();

Это не нужно делать логическую проверку во время итерации и не нужно выполнять постобработку строки.

Ответ 2

Может быть вместо вызова sb.length() снова и снова в цикле, я немного изменился.

StringBuilder sb = new StringBuilder();
String separator = "";
for(String item : data){
    sb.append(separator);
    separator=",";
    sb.append(item);
}
joined = sb.toString();

Ответ 3

Java 8 +

joined = String.join(separator, data);

Java 7 и ниже

StringBuilder sb = new StringBuilder();
boolean first = true;
for(String item : data){
    if(!first || (first = false)) sb.append(separator);
    sb.append(item);
}
joined = sb.toString();

Ответ 4

В Java 8:

String.join (separator, data)

Ответ 5

Да, это лучший и самый быстрый способ сделать это на простой Java.

См. эту статью для получения дополнительной информации:

http://www.yoda.arachsys.com/java/strings.html

Ответ 6

Различные намерения:

Для инструментов третьей части, таких как Guava Joiner, который не является быстрым, но очень гибким. Существует множество опционных методов для настройки поведения соединения, например skipNulls().

Обычная Java быстро, но вам нужно написать несколько строк кода самостоятельно.

Ответ 7

Collectors может присоединиться к Streams, который очень полезно, если вы хотите filter или map ваши данные.

String joined = Stream.of("Snap", "Crackle", "Pop")
        .map(String::toUpperCase)
        .collect(Collectors.joining(", "));

Чтобы получить поток из коллекции, вызовите stream():

Arrays.asList("Snap", "Crackle", "Pop").stream()

Ответ 8

Ваше предложение - возможное решение, другое общее:

for (String item: data) {
    sb.append(item)
    sb.append(separator);
}
String joined = sb.substring(0, sb.length() - separator.length())