在Java编程中,字符串的拼接是一个常见的操作。Java提供了多种方法来实现字符串拼接,其中之一就是StringJoiner类。本文将详细介绍StringJoiner
的用法和功能。
StringJoiner简介
StringJoiner
是Java 8引入的一个用于拼接字符串的工具类。它允许我们以指定的分隔符将一组字符串连接成一个单独的字符串。我们可以在其源码中看到一个熟悉的身影StringBuilder
,它是基于StringBuilder
实现字符串操作的,所以它的性能和StringBuilder
是差不多的,它也是非线程安全的。
以下是关于StringJoiner
构造方法和属性的源码:
package java.util;
public final class StringJoiner {
private final String prefix;
private final String delimiter;
private final String suffix;
private StringBuilder value;
private String emptyValue;
public StringJoiner(CharSequence delimiter) {
this(delimiter, "", "");
}
public StringJoiner(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
Objects.requireNonNull(prefix, "The prefix must not be null");
Objects.requireNonNull(delimiter, "The delimiter must not be null");
Objects.requireNonNull(suffix, "The suffix must not be null");
// make defensive copies of arguments
this.prefix = prefix.toString();
this.delimiter = delimiter.toString();
this.suffix = suffix.toString();
this.emptyValue = this.prefix + this.suffix;
}
}
字段说明:
- prefix:这是一个私有字段,表示拼接后的字符串的前缀部分。在构造函数中通过传递参数指定,如果未提供则默认为空字符串。
- delimiter:这是一个私有字段,表示拼接字符串时使用的分隔符。同样,它在构造函数中通过参数传递,如果未提供则默认为空字符串。
- suffix:这是一个私有字段,表示拼接后的字符串的后缀部分。同样,它在构造函数中通过参数传递,如果未提供则默认为空字符串。
- value:这是一个私有字段,它是一个StringBuilder对象,用于存储实际的拼接结果。
- emptyValue:这是一个私有字段,用于存储拼接结果为空时的默认值,即前缀和后缀的组合。这个值在构造函数中初始化。
构造函数详解:
- StringJoiner(CharSequence delimiter)
这个构造函数接受一个CharSequence类型的参数delimiter,它表示拼接字符串时要使用的分隔符。前缀和后缀默认为空字符串。
- StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
这个构造函数接受三个CharSequence类型的参数,分别是分隔符delimiter
、前缀prefix
和后缀suffix
。这个构造函数允许您自定义拼接结果的格式。在构造函数内部,会检查这些参数是否为null,并将它们转换为字符串形式保存在相应的字段中。同时,也会初始化emptyValue字段为前缀和后缀的组合。
add()
方法
add()
方法是StringJoiner
类最重要的方法之一。add()
方法用于将元素添加到StringJoiner
对象中。这个方法用于将一个新元素(newElement)添加到StringJoiner
对象中,并返回StringJoiner对象本身(支持链式调用)。源码如下:
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
示例代码:
public static void main(String[] args) {
StringJoiner stringJoiner = new StringJoiner(",","[","]");
stringJoiner.add("x") .add("j");
StringJoiner stringJoiner1 = new StringJoiner(",","(",")");
stringJoiner1.add("x1").add("j1");
System.out.println(stringJoiner.toString());
System.out.println(stringJoiner1.toString());
System.out.println(stringJoiner1.merge(stringJoiner).toString());
System.out.println(stringJoiner1.toString());
System.out.println(stringJoiner.merge(stringJoiner1).toString());
}
输出结果:
[x,j]
(x1,j1)
(x1,j1,x,j)
(x1,j1,x,j)
[x,j,x1,j1,x,j]
stream中的应用
有些家人们可能会说,如果我需要把集合 List list 中的字符串使用,
拼接的话可以直接借助stream实现
list.stream().collect(Collectors.joining(","));
我们可以看下Collectors.joining(",")
的源码就可以发现,他就是借助StringJoiner
实现的,源码如下:
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
return joining(delimiter, "", "");
}
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, StringJoiner::merge,
StringJoiner::toString, CH_NOID);
}
总结
StringJoiner
是一个方便的工具类,用于将字符串连接在一起。- 它提供了灵活的配置选项,适用于各种字符串拼接需求。
希望本文能够帮助您更好地理解和使用Java中的StringJoiner
类。通过它,您可以更轻松地处理字符串拼接操作,提高代码的可读性和可维护性。