Java is addressing issue of boilerplate code which developers can hardly avoid. One such boilerplate code is concatenating list of strings with a delimiter. This has been mainly used by developers to write formatted output.
For example:
For a list of city names we may want to print as
[Bangalore, Delhi, Mumbai, Chennai, Kolkata]
Traditional Way
String[] cities = { "Bangalore", "Delhi", "Mumbai", "Chennai", "Kolkata" };
StringBuilder output = new StringBuilder();
output.append("[");
for (int i = 0; i < cities.length; i++) {
output.append(cities[i]);
if(i<cities.length-1)
output.append(",");
}
output.append("\]");
System.out.println(output);
Output:
[Bangalore,Delhi,Mumbai,Chennai,Kolkata]
With StringJoiner API
With Java 8 we have java.util.StringJoiner.StringJoiner API. This does the same functionality as above but being less verbose.
String[] cities = { "Bangalore", "Delhi", "Mumbai", "Chennai", "Kolkata" };
StringJoiner joiner = new StringJoiner(",", "[", "]");
for (String city : cities) {
joiner.add(city);
}
System.out.println(joiner);
Output:
[Bangalore,Delhi,Mumbai,Chennai,Kolkata]

StringJoiner API needs three main inputs:
- delimiter
- prefix of the list (optional)
- suffix of the list (optional)
as indicated by its constructor:
java.util.StringJoiner.StringJoiner(CharSequence **delimiter**, CharSequence **prefix**, CharSequence **suffix**)
StringJoiner API can be used in various contexts where list of strings needs to be concatenated.
Following examples show few of them.
- Joining an array of strings
Class String has join() API to perform joining operation on given CharSequence or Iterable.
String[] cities = { "Bangalore", "Delhi", "Mumbai", "Chennai", "Kolkata" };
List<String> list = Arrays.asList(cities);
System.out.println(String.join(",", list));
Output:
Bangalore,Delhi,Mumbai,Chennai,Kolkata
- Joining strings coming from stream
String[] cities = { "Bangalore", "Delhi", "Mumbai", "Chennai", "Kolkata" };
List<String> list = Arrays.asList(cities);
String output = list.stream().collect(Collectors.joining(",", "[", "]"));
System.out.println(output);
Output:
[Bangalore,Delhi,Mumbai,Chennai,Kolkata]
- Setting empty list string message
An empty list message can be set to be shown when joiner is empty.
String[] cities = {};
StringJoiner joiner = new StringJoiner(",", "[", "]");
joiner.setEmptyValue("EMPTY!");
for (String city : cities) {
joiner.add(city);
}
System.out.println(joiner);
Output:
EMPTY!
- Merge of joiners
Given string joiner is added to the next element of the current string joiner.
StringJoiner joiner1 = new StringJoiner(",", "[", "]");
joiner1.add("A").add("B").add("C");
System.out.println(joiner1);
StringJoiner joiner2 = new StringJoiner("|", "{", "}");
joiner2.add("1").add("2").add("3");
System.out.println(joiner2);
System.out.println(joiner1.merge(joiner2));
Output:
[A,B,C] {1|2|3} [A,B,C,1|2|3]
That’s it !