深入了解Java中的StringJoiner类

2023-09-25 14:33:29 浏览数 (3)

在Java编程中,字符串的拼接是一个常见的操作。Java提供了多种方法来实现字符串拼接,其中之一就是StringJoiner类。本文将详细介绍StringJoiner的用法和功能。

StringJoiner简介

StringJoiner是Java 8引入的一个用于拼接字符串的工具类。它允许我们以指定的分隔符将一组字符串连接成一个单独的字符串。我们可以在其源码中看到一个熟悉的身影StringBuilder,它是基于StringBuilder实现字符串操作的,所以它的性能和StringBuilder是差不多的,它也是非线程安全的。以下是关于StringJoiner 构造方法和属性的源码:

代码语言:javascript复制
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对象本身(支持链式调用)。源码如下:

代码语言:javascript复制

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;
}

示例代码:

代码语言:javascript复制
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());
}

输出结果:

代码语言:javascript复制
[x,j]
(x1,j1)
(x1,j1,x,j)
(x1,j1,x,j)
[x,j,x1,j1,x,j]

stream中的应用

有些家人们可能会说,如果我需要把集合 Listlist 中的字符串使用,拼接的话可以直接借助stream实现

代码语言:javascript复制
list.stream().collect(Collectors.joining(","));

我们可以看下Collectors.joining(",") 的源码就可以发现,他就是借助StringJoiner实现的,源码如下:

代码语言:javascript复制
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类。通过它,您可以更轻松地处理字符串拼接操作,提高代码的可读性和可维护性。

0 人点赞