Java 8中StringJoiner的使用指南:字符串拼接新方法详解

Java 8 提供了 StringJoiner 。本文将介绍这个用于字符串拼接的新工具。

Java 8中StringJoiner的使用指南:字符串拼接新方法详解

如果你想知道进行字符串拼接有多少种方法,我教你一个简单的办法。在 Intellij IDEA 中,先定义一个 Java Bean,接着尝试使用快捷键来自动生成一个 toString 方法,此时 IDEA 会提示有多种 toString 生成策略可供选择。

![][2]

目前我所使用的 IDEA,其 toString 生成策略默认采用的是由 JDK 1.8 所提供的 StringJoiner。

介绍

StringJoiner是位于 java.util 包中的一个类。它可以用来构造一个由分隔符分隔的字符序列,这个分隔符是可选的。同时,它还能够从提供的前缀开始,以提供的后缀结束。虽然在 StringBuilder 类的帮助下,也可以在每个字符串之后附加分隔符,但是 StringJoiner 提供了更简单的方法来实现,无需编写大量的代码。

StringJoiner类有 2 个构造函数,还有 5 个公有方法。在这些方法当中,最常用的方法是 add 方法以及 toString 方法,这与 StringBuilder 中的 append 方法和 toString 方法类似。

用法

StringJoiner 的用法较为简单。在下面的代码里,我们借助 StringJoiner来进行字符串的拼接。

类 StringJoinerTest 属于公共类。
公共静态的 void 主方法(String[] 参数) {
创建了一个名为 sj 的 StringJoiner 对象,使用 "Hollis" 作为连接符。
        sj.add("hollischuang");
        sj.add("Java干货");
System 打印出 sj 的字符串形式。
创建了一个名为 sj1 的 StringJoiner 对象,使用冒号作为分隔符,以左方括号开头,以右方括号结尾。
sj1 进行了添加操作,添加了 "Hollis";sj1 还进行了添加操作,添加了 "hollischuang";sj1 又进行了添加操作,添加了 "Java 干货"。
通过调用 toString() 方法获取 sj1 的字符串表示。
    }
}

以上代码输出结果:

hollischuangHollisJava干货
[Hollis:hollischuang:Java干货]

值得注意的是,当我们用 StringJoiner(CharSequence delimiter) 来初始化一个 StringJoiner 时,这个 delimiter 实际上是分隔符,而不是可变字符串的初始值。

StringJoiner 的第二个参数是拼接后的字符串的前缀,第三个参数是拼接后的字符串的后缀。

原理

在介绍了简单的用法之后,接着我们来看这个 StringJoiner 的原理,看看它究竟是怎样实现的。重点来看一下 add 方法。

公共的 StringJoiner 添加(字符序列新元素)。
准备构建器。将新元素追加到构建器中。
    return this;
}
构建一个 StringBuilder 用于后续操作。
    if (value != null) {
        value.append(delimiter);
    } else {
value 等于一个新创建的 StringBuilder 对象,然后将 prefix 追加到这个 StringBuilder 对象中。
    }
    return value;
}

看到了一个熟悉的身影,那就是 StringBuilder 。没错,StringJoiner实际上是依靠 StringBuilder 来实现的。

我们发现 StringJoiner 是通过 StringBuilder 实现的。之后,我们大概就能猜到,它的性能损耗应该和直接使用 StringBuilder 差不多。

为什么需要StringJoiner

了解了 StringJoiner 的用法和原理之后,很多读者可能会产生疑问。因为已经有了一个 StringBuilder,那么为什么 Java 8 中还要定义一个 StringJoiner 呢?它到底有什么好处呢?

如果读者对 Java 8 有足够的了解,或许能够猜出个大概情况。这肯定与 Stream 存在关联。

作者也在[Java doc][3]中找到了答案:

试想,在Java中,如果我们有这样一个List:

ListImmutableList 中包含了 "Hollis"、"hollischuang"、"Java 干货" 这些元素。

如果我们想要把他拼接成一个以下形式的字符串:

Hollis,hollischuang,Java干货

可以通过以下方式:

创建了一个 StringBuilder 对象,名为 builder 。
if (!list.isEmpty()) {
    builder.append(list.get(0));
定义一个整型变量 i 并初始化为 1,同时获取列表 list 的大小并赋值给整型变量 n;当 i 小于 n 时,执行循环体中的代码;在循环体中,获取当前索引 i 对应的元素并赋值给变量 element;将 element 添加到新的列表 newList 中;然后将 i 的值加 1。< n; i++) {
        builder.append(",").append(list.get(i));
    }
}
builder.toString();

还可以使用:

使用 stream 对 list 进行操作,先创建一个 StringBuilder 对象作为初始值,然后通过一个 lambda 表达式,将每个元素 s 追加到 StringBuilder 对象 sb 中,并在后面添加一个逗号,最后使用 StringBuilder 的 append 方法将所有元素连接起来,最后将 StringBuilder 对象转换为字符串并返回。

但是输出结果稍有些不同,需要进行二次处理:

Hollis,hollischuang,Java干货,

还可以使用"+"进行拼接:

使用 stream 对 list 进行操作,先通过 reduce 方法将元素两两相加(a + "," + b),然后将结果转换为字符串 toString()

以上几种方式,有的代码较为复杂;有的性能不够高;还有的无法直接获取到想要的结果。

为了满足类似的需求,在 Java 8 中,StringJoiner 就发挥作用了。上述需求仅需一行代码:

通过 stream 方法对 list 进行操作,然后使用 collect 方法,在 collect 方法中使用 joining 方法并传入":"作为连接符,将 list 中的元素连接起来。

在上述使用的表达式里,Collectors.joining 的源代码情况如下:

public static Collector然后进行加入的操作。
                                                         CharSequence prefix,
                                                         CharSequence suffix) {
    return new CollectorImpl<>(
使用 delimiter 作为分隔符,prefix 作为前缀,suffix 作为后缀来创建一个新的 StringJoiner 。
StringJoiner 具有添加元素的功能,即 StringJoiner::add;同时它还具备合并的功能,也就是 StringJoiner::merge。
使用 StringJoiner 的 toString 方法,传入 CH_NOID 参数。
}

其实现原理就是借助了StringJoiner。

或许在 Collector 中直接使用 StringBuilder 能够实现类似的功能,只是会稍微麻烦一点。因此,Java 8 提供了 StringJoiner 以丰富 Stream 的用法。

StringJoiner能够很方便地添加前缀和后缀。例如,若我们期望得到的字符串是[Hollis,hollischuang,Java 干货],而非仅仅是 Hollis,hollischuang,Java 干货,那么 StringJoiner 的优势就会更加显著。

总结

本文介绍了 Java 8 中所提供的一种可变字符串类,即 StringJoiner。这种类可用于字符串的拼接操作。

StringJoiner是通过StringBuilder来实现的。所以它的性能与StringBuilder相近。并且它也是非线程安全的。

如果日常开发中中,需要进行字符串拼接,如何选择?

1、如果只是简单的字符串拼接,考虑直接使用"+"即可。

如果是在 for 循环里进行字符串拼接的话,那么就可以考虑使用 StringBuilder 或者 StringBuffer 。

如果是利用一个 List 来进行字符串的拼接,那么就可以考虑使用 StringJoiner。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读