Предпочтительный язык для присоединения к коллекции строк в Java - PullRequest
21 голосов
/ 08 февраля 2011

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

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

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

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

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();

Ответы [ 7 ]

16 голосов
/ 12 февраля 2011

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

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();

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

10 голосов
/ 08 февраля 2011

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

StringBuilder sb = new StringBuilder();
String separator = "";
for(String item : data){
    sb.append(separator);
    separator=",";
    sb.append(item);
}
joined = sb.toString();
8 голосов
/ 08 февраля 2011

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();
5 голосов
/ 14 ноября 2013

В Java 8:

String.join (separator, data)
1 голос
/ 08 апреля 2016

Коллекторы могут объединяться Потоки , что очень полезно, если вы хотите filter или map ваши данные.

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

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

Arrays.asList("Snap", "Crackle", "Pop").stream()
1 голос
/ 08 февраля 2011

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

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

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

0 голосов
/ 08 февраля 2011

Ваше предложение является возможным решением, другое распространенное:

for (String item: data) {
    sb.append(item)
    sb.append(separator);
}
String joined = sb.substring(0, sb.length() - separator.length())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...