Joining Strings in Java 8
Java is addressing issue of boiler plate code which developers can hardly avoid. One such boiler plate 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 !