首页 > 编程语言 >深入了解Java中的StringJoiner类

深入了解Java中的StringJoiner类

时间:2023-09-23 23:32:18浏览次数:39  
标签:Java suffix prefix delimiter 深入 StringJoiner CharSequence 字符串

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

深入了解Java中的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类。通过它,您可以更轻松地处理字符串拼接操作,提高代码的可读性和可维护性。

标签:Java,suffix,prefix,delimiter,深入,StringJoiner,CharSequence,字符串
From: https://blog.51cto.com/xiuji/7581555

相关文章

  • JavaScript-实例对象与 new 命令
    对象是什么 面向对象编程(ObjectOrientedProgramming,缩写为OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。每一个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。对象可以......
  • java学习路线(一)
    各位晚上好,今天跟大家稍微说一下,对于小白,我认为的入门路线简述javaSE首先就是javaSE(也就是java基础语法,比如数据类型,集合,if,循环语句,多线程,异常捕获,反射等最基本操作,也是最重要的,万丈高楼平地起,这就相当于地基,所以兄弟们,一定不要偷懒)简述MySQL然后就是MySQL(众所周知,后端是必然少......
  • java基础——随笔04
    JavaObject类JavaObject类是所有类的父类,也就是说Java的所有类都继承了Object,子类可以使用Object的所有方法。Object类位于java.lang包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承Object,成为Object的子类。Object类可以显......
  • 说说 Java 类加载机制是什么
    加载,获取类的字节码,并且放到jvm的元空间中,生成Class对象链接验证:验证字节码是否符合jvm的规范,是否安全等准备:将静态变量赋默认值(不是自己的默认值,而是int是0这种)解析:将符号引用转为直接引用初始化:将静态变量赋初始值(自己写的初始值),执行静态代码块使用卸载:将Class对象清......
  • 9.23JavaScript2
    书写语法:(基本和java没区别)区分大小写:与Java一样,变量名、函数名以及其他一切东西都是区分大小写的每行结尾的分号可有可无(建议写,规范)注释:单行注释://注释内容多行注释:/*注释内容*/大括号表示代码块......
  • 无涯教程-JavaScript - PEARSON函数
    描述PEARSON函数返回Pearson乘积矩相关系数r,它是一个无因次索引,范围为-1.0到1.0(含),反映了两个数据集之间线性关系的程度。语法PEARSON(array1,array2)争论Argument描述Required/OptionalArray1Asetofindependentvalues.RequiredArray2Asetofdependent......
  • 无涯教程-JavaScript - NORM.S.DIST函数
    描述NORM.S.DIST函数返回标准正态分布(平均值为零,标准偏差为1)。使用此功能代替标准法线区域的表格。语法NORM.S.DIST(z,cumulative)争论Argument描述Required/OptionalZThevalueforwhichyouwantthedistribution.RequiredCumulative累积值是确定函数形式......
  • 无涯教程-JavaScript - NORM.S.INV函数
    描述NORMS.S.INV函数返回标准正态累积分布的反函数。该分布的平均值为零,标准偏差为1。语法NORM.S.INV(probability)争论Argument描述Required/OptionalProbabilityAprobabilitycorrespondingtothenormaldistribution.RequiredNotes如果概率为非数值,则NOR......
  • JavaScript实现排序算法
    目录前言排序算法冒泡排序选择排序插入排序归并排序快速排序计数排序基数排序桶排序前言排序算法是《数据结构与算法》中最基本的算法之一,本篇使用JavaScript语言实现各种常见排序算法。排序算法冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻......
  • 无涯教程-JavaScript - NEGBINOM.DIST函数
    描述NEGBINOM.DIST函数返回负二项式分布,即在第Number_s次成功之前出现Number_f次失败的概率,并具有Probability_s成功的概率。该函数与二项式分布相似,不同之处在于成功次数是固定的,而试验次数是可变的。像二项式一样,假定审判是独立的。语法NEGBINOM.DIST(number_f,numb......