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:

  1. delimiter
  2. prefix of the list (optional)
  3. 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 !