This is profoundly simple, yet I've seen many variants, and I don't see my own practice much elsewhere. Given:
Iterable<String> strings;
create a String containing all the strings, separated by commas.
With Java 8, luckily, there is finally a standard way to do this:
String string = StreamSupport.stream(strings.spliterator(), false)
.collect(Collectors.joining(", "));
Unfortunately, there's not an easier way to get from an Iterable
to a Stream
(yet)
Use
org.apache.commons.lang.StringUtils.join(Iterator iterator, String separator)
From
http://commons.apache.org/lang/
If you want to do it yourself, I sometimes do
StringBuilder sb = new StringBuilder();
String separator = "";
for (String string : iterable) {
sb.append(separator);
sb.append(string);
separator = ", ";
}
final StringBuilder sb = new StringBuilder();
final Iterator<String> it = iterable.iterator();
if(it.hasNext()){
sb.append(it.next());
while(it.hasNext()){
sb.append(',').append(it.next());
}
}
return sb.toString();
but of course I would always prefer to use Guava's version
String joined = Joiner.on(',').join(iterable);
(To be fair: I have previously asked a very similar question)
If you use Java 8 or higher, you can use String.join
.
Iterable<String> strings = Arrays.asList("a", "b", "c");
String result = String.join(",", strings);
Assert.assertEquals("a,b,c", result);
If you use Eclipse Collections, you can use the Iterate
utility class which works with any Iterable
.
Iterable<String> strings = Arrays.asList("a", "b", "c");
String result = Iterate.makeString(strings, ",");
Assert.assertEquals("a,b,c", result);
Eclipse Collections 7.x works with Java 5 or higher. Eclipse Collections 8.x-9.x works with Java 8 or higher.
Note: I am a committer for Eclipse Collections.
Here's the join function I include in most projects:
public static String join(Iterable<? extends Object> iterable, String delimiter) {
return join(iterable, delimiter, "", "");
}
public static String join(Iterable<? extends Object> iterable, String delimiter,
String prepend, String append) {
StringBuilder buffer = new StringBuilder();
Iterator<?> iterator = iterable.iterator();
boolean hasNext = iterator.hasNext();
while (hasNext) {
buffer.append(prepend);
buffer.append(String.valueOf(iterator.next()));
buffer.append(append);
if (iterator.hasNext()) {
buffer.append(delimiter);
} else {
hasNext = false;
}
}
return buffer.toString();
}
Some examples:
String[] list = { "hello", "mellow", "jello" };
Util.join(list, ","); // "hello,mellow,jello"
Util.join(list, ", and "); // "hello, and mellow, and jello"
Util.join(list, "&", "x=", "1"); // "x=hello1&x=mellow1&x=jello1"
Util.join(list, " OR ", "(Title:", ")"); // "(Title:hello) OR (Title:mellow) OR (Title:jello)"
Just for fun, a recursive implementation:
public static void main(String[] args) {
System.out.println(buildCsv(Arrays.asList(new String[] {"one", "two", "three"}).iterator()));
}
private static String buildCsv(Iterator<String> iterator) {
return iterator.hasNext() ? iterator.next() + (iterator.hasNext() ? "," : "") + buildCsv(iterator) : "";
}