Предпочтительная идиома для присоединения коллекции строк в 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();
Ответы
Ответ 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())