Java 8 added a new class StringJoiner
in java.util
package, which is used to join strings with a separator.
With StringJoiner
, you can also add prefix and suffix strings to the result.
Example, with StringJoiner
, you can join strings “learning”, “java”, “online” with “-“ as a separator to form “learning-java-online” as the result.StringJoiner
is added in java.util
package and it is a final class.
This article will explain how to use StringJoiner
in java 8 to combine string values, its syntax with example programs.
Creating StringJoiner
To use StringJoiner
, its instance or object needs to be created using any of its below constructors.
1. StringJoiner(CharSequence delimiter)
This constructor takes a String argument which is the delimiter or separator between the strings to be joined.
2. StringJoiner(CharSequence delimiter,
CharSequence prefix, CharSequence suffix)
This constructor takes 3 string arguments which represent:
A. Delimiter or separator between the strings to be joined.
B. Prefix which will be added before the result.
C. Suffix which will be added after the result. Example,
new StringJoiner(“,”, “{“, “}” );
Here, the separator is a comma and the resultant string will be surrounded between { and }.
Adding Strings
Strings to be joined are added using add()
method of StringJoiner
. add()
takes a string argument which is added after the other strings as shown below
StringJoiner j = new StringJoiner(","); j.add("learning"); j.add("java");
Note that add()
returns the same StringJoiner
object on which it was called. So, instead of calling add()
separately every time, you can chain multiple calls as below.
StringJoiner j = new StringJoiner(","); j.add("learning").add("java");
StringJoiner example
Below is a complete example of StringJoiner
which adds multiple strings separated by a delimiter.
public class StringJoinerExample { public static void main(String[] args) throws IOException { // create object StringJoiner j = new StringJoiner("-"); // add strings j.add("learning").add("java").add("is").add("fun"); System.out.println(j.toString()); } }
This prints
learning-java-is-fun
StringJoiner : prefix and suffix
As stated above, StringJoiner
allows you to add prefix and suffix around the joined strings.
For defining prefix and suffix, create StringJoiner
with a constructor that takes 3 arguments. Example,
public class StringJoinerExample { public static void main(String[] args) throws IOException { // create object StringJoiner j = new StringJoiner("-", "[", "]"); // add strings j.add("learning").add("java").add("is").add("fun"); System.out.println(j.toString()); } }
Output is
[learning-java-is-fun]
Merge StringJoiners
Different StringJoiner
objects can be merged to form a single string value using its merge()
method.merge()
is invoked on a StringJoiner
object and takes another object as argument. It joins the contents to the argument StringJoiner
to the object on which it is invoked.
This means that the object on which it is called is modified while the argument object remains unmodified. Example,
// create first StringJoiner StringJoiner j1 = new StringJoiner(","); j1.add("learning").add("java"); // create second StringJoiner StringJoiner j2 = new StringJoiner(","); j2.add("is").add("fun"); // merge both j1.merge(j2); System.out.println(j1.toString()); System.out.println(j2.toString());
Output is
learning,java,is,fun
is,fun
Argument object remains unchanged while its contents are merged into the invoking object.
StringJoiner vs StringBuilder/StringBuffer
java.lang.StringBuilder
or java.lang.StringBuffer
are also used for joining multiple strings together using their append()
method.
Then why StringJoiner?
The answer is StringJoiner
is very easy to use as compared to both these classes. Following are a couple of scenarios to prove this.
1. With StringBuilder
or StringBuffer
, you need to repeat the separator every time it needs to be added. For adding 4 strings, with a prefix and suffix, StringBuilder
will require below code
StringBuilder b = new StringBuilder("["); b.append("learning").append(",").append("java"). append(",").append("is").append("fun").append("]");
While with StringJoiner
, below code will be used
StringJoiner j = new StringJoiner(",", "[", "]"); j.add("learning").add("java").add("is").add("fun");
2. If the strings are joined within a loop, then StringBuilder
or StringBuffer
will add an extra separator, which needs to be separately removed after the loop as shown below.
List<String> words = List.of("learning", "java", "is", "fun"); StringBuilder b = new StringBuilder(""); for (String word : words) { b.append(word).append(","); } System.out.println(b.toString()); String result = ""; // remove trailing separator if(!b.toString().equals("")) { result = b.substring(0, b.length()-1); } System.out.println(result);
This prints
learning,java,is,fun,
learning,java,is,fun
You can see that simply appending strings also adds an extra separator that needs to be removed explicitly, while there is no such problem with StringJoiner
.
StringJoiner methods
Following are some of the important methods of StringJoiner
.
1. add(CharSequence s)
It is used to add a string to be joined. We have already looked at this method in action.
2. setEmptyValue(CharSequence value)
When StringJoiner
is created using its constructor, it does not contain any value till add()
is called.setEmptyValue()
allows you to set an empty value for StringJoiner
. The value is supplied as argument. Example,
StringJoiner j = new StringJoiner(","); System.out.println("Value of StringJoiner: " + j.toString()); j.setEmptyValue("Nothing here!"); System.out.println("Value of StringJoiner: " + j.toString());
This prints
Value of StringJoiner:
Value of StringJoiner: Nothing here!
Remember that empty value is removed as soon as a value is added to StringJoiner.
3. merge(StringJoiner j)
This method merges the contents of argument StringJoiner
to the StringJoiner
on which it is called. Contents of argument StringJoiner
remain unchanged.merge()
returns the same object on which it was called. So, you can chain multiple merge()
calls or even apply add()
calls after merge as
j.merge(j1).merge(j2).add(“A”);
We have already seen this merge() in action above.
4. length()
length()
method returns the number of characters in StringJoiner
. This includes the separators, prefix and suffix values. Example,
StringJoiner j = new StringJoiner(",","[","]"); j.add("a").add("b"); System.out.println("Length of StringJoiner: "+j.length());
This prints
Length of StringJoiner: 5
Remember that separators, prefix and suffix are only counted when a string has been added to the StringJoiner
.
If it has empty value, then these are not included in length. Example,
StringJoiner j = new StringJoiner(",","[","]"); j.setEmptyValue("nothing"); System.out.println("Length of StringJoiner: "+j.length());
Output is
Length of StringJoiner: 7
which is the length of empty value only.
Hope the article was useful.