Problem
Suppose there is a bunch of String objects and you want to join them by a separator to form a combined string. For Example, I have 3 strings “www”, “codippa” and “com”. I want to join these strings with a “.”(dot). Normal approach would be :
String s1 = “www”;
String s2 = “codippa”;
String s3 = “com”;
String joinedString = s1 + “.” + s2 + “.” + s3;
This approach is fine but only when the number of strings to be joined is less. When the string values to be joined are more, this approach has following shortcomings:
- Code will be more cluttered. Imagine the above line of code with s1 to s15. It will be too lengthy and will look highly unprofessional.
- Joining a string with another string creates a new object every time. So 15 strings added means 15 new objects created which means more memory usage. This one is serious !!!
Solution
Java 8 provides the solution to the above problem in the form of java.util.StringJoiner
class. This class can automatically add the required separator in between the strings with an added advantage of prefixing and suffixing the result with the desired characters. Using this class is pretty simple.
Initialize its object with the required separator and just add the strings you need to join by calling its add
method and it will automatically join those strings with the configured separator. This class has following constructors :
- public StringJoiner(CharSequence delimiter) : Takes the separator to be added between the strings as argument.
- public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) : Takes 3 arguments : the separator to be added, the prefix to be added to the result and the suffix to be added to the result.
Code example using both the constructor forms is given below:
import java.util.StringJoiner;
public class StringJoinerExample {
public static void main(String[] args) {
// initialize StringJoiner with only separator as argument
StringJoiner joinerWithSeparatorOnly = new StringJoiner(".");
// add strings to combine with the separator
joinerWithSeparatorOnly.add("www");
joinerWithSeparatorOnly.add("codippa");
joinerWithSeparatorOnly.add("com");
System.out.println("Joined String is :");
System.out.println(joinerWithSeparatorOnly);
System.out.println("------------------------");
// initialize StringJoiner with separator, prefix and suffix as
// arguments
StringJoiner joinerWithSuffixAndPrefix = new StringJoiner(".", "[", "]");
// add strings to combine with the separator
joinerWithSuffixAndPrefix.add("www");
joinerWithSuffixAndPrefix.add("codippa");
joinerWithSuffixAndPrefix.add("com");
System.out.println("Joined String With Prefix and Suffix is :");
System.out.println(joinerWithSuffixAndPrefix);
}
}
Output
Joined String is :
www.codippa.com
————————
Joined String With Prefix and Suffix is :
[www.codippa.com]
Instead of calling add
method of multiple times in different lines, it can be called in single line as :
One would say that we can use java.lang.StringBuffer
or java.lang.StringBuilder
to add the strings with no extra objects created. Yes, you can but for that you need to create a new object of these classes within your code. Further, to join 5 Strings with 4 separators in between you need to call their append
method 9 times. Adding a prefix and suffix before the resultant string makes it to 11. This will again make the code cluttered. Thus using java.util.StringJoiner
is a more cleaner approach.
Let’s tweak in :
- StringJoiner internally uses
java.lang.StringBuilder
to hold the string value. add
method of StringJoiner returns an object of StringJoiner only. So instead of callingadd
method in different lines, they can be called one after another in the same line as shown above.- When printing a StringJoiner object, its
toString()
method is called which returns the current value stored in this object. - If you are using the constructor which uses prefix and suffix, you cannot set these to
null
otherwise ajava.lang.NullPointerException
will be thrown.