深入了解Java中的StringJoiner类

news2024/11/16 7:46:34

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

java-stringjoiner.jpg

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何建立团队知识库管理系统,把分散信息有效整理?

对于我们广大企业管理者来说&#xff0c;知识库作为一个「统一的资料收集中心」&#xff0c;意义在于将分散的资料集中起来&#xff0c;统一处理&#xff0c;降低管理成本。 以常见的项目小组为例&#xff0c;如果你希望将小组内优秀的方法论和工作SOP文档在整个部门分享学习&a…

PID之Simulink仿真

昨天&#xff0c;在中南大学面试的老师&#xff0c;老师突然问到如何调PID&#xff0c;关于PID&#xff0c;我只知道一些基本概念&#xff0c;实际中并没有做过相关PID的项目&#xff0c;就连仿真也没搞过&#xff0c;所以今天就照着网上的教程做了PID的仿真&#xff0c;调PID的…

【李沐深度学习笔记】自动求导实现

课程地址和说明 自动求导实现p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 自动求导 # 创建变量 import torch x torch.arange(4, dtypetorch.float32) #只有浮点数才能求导 # 计算y关于x的梯度之前&#x…

VUE之模板解析(v-for)

v-for的多种写法 1. item in list 2. (item, index) in list 3. (item, name, index) in object forAliasRE 非贪婪模式匹配 &#xff1f; 正则表达式默认都是贪婪匹配&#xff0c;添加&#xff1f;后将其变成非贪婪模式 由下面例子可以看出如果没有添加&#xff1f;正则…

虚拟机软件Parallels Desktop 18 mac中文新增功能(PD18虚拟机)

Parallels Desktop 18可以在 Mac 计算机上下载并安装 Windows 操作系统。在 Mac 与 Windows 之间无缝复制和粘贴文本或拖放对象。在 Mac 虚拟机中跨多个操作系统开发和测试。毫不费力地运行 Windows 应用程序&#xff0c;不会减慢 Mac 的运行速度。 Parallels Desktop 18 for M…

lv5 嵌入式开发-5 线程的创建和参数传递

目录 1 线程基础 2 Linux线程库 2.1 线程创建 – pthread_create 2.2 线程结束 – pthread_exit 2.3 线程查看tid函数 2.4 线程间参数传递&#xff08;重点&#xff09; 2.4.1 练习 2.5 线程查看命令&#xff08;多线程&#xff09; 2.6 线程回收 – pthread_join 2.…

【重新定义matlab强大系列十四】基于问题求解有/无约束非线性优化

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询&#xff0c;我们迫切的希望mysql能查询的更快一些&#xff0c;我们经常用到的查询有&#xff1a; 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录&#xff08;between and&#xff09; …

如何解决python安装Crypto失败的问题

文章目录 准备安装相关链接准备 Python Crypto模块是一个第三方库,它提供了常见的加密算法和协议,比如AES、RSA、DES等。 PyCrypto 是加密工具包 Crypto 的 python 版,该模块实现了各种算法和协议的加密,提供了各种加密方式对应的算法的实现,包括单向加密、对称加密及公钥…

Linux(ubuntu)系统更新后不能进入图形界面

最近需要跑一个深度学习的程序&#xff0c;把许久没用的ubuntu系统调了出来&#xff0c;手欠的我更新了一下系统&#xff0c;结果再启动&#xff0c;系统就只停留在光标闪动那里&#xff0c;不能看到图形界面了。网上查了一下&#xff0c;说是因为更新后&#xff0c;显卡驱动没…

MySQL 8.0数据库主从搭建和问题处理

错误处理&#xff1a; 在从库通过start slave启动主从复制时出现报错 Last_IO_Error: error connecting to master slaveuser10.115.30.212:3306 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication require…

【draw】draw.io怎么设置默认字体大小

默认情况下draw里面的字体大小是12pt&#xff0c;我们可以将字体改成我们想要的大小&#xff0c;例如18pt。 然后点击样式&#xff0c;设置为默认样式。 下一次当我们使用文字大小时就是18pt了。

html和css相关操作

html第一个网页 <!DOCTYPE html> <!--html文档声明&#xff0c;声明此文档是一个html5的文档--> <html> <!--html文档开头标签--><head><!--html文档的设置标签&#xff0c;文档的设置及资源的引用都写在这个标签中--><meta charset&q…

[论文笔记]Prefix Tuning

引言 今天带来微调LLM的第二篇论文笔记Prefix-Tuning。 作者提出了用于自然语言生成任务的prefix-tuning(前缀微调)的方法,固定语言模型的参数而优化一些连续的任务相关的向量,称为prefix。受到了语言模型提示词的启发,允许后续的token序列注意到这些prefix,当成虚拟toke…

1793_树莓派杂志第一期MagPi01阅读

全部学习汇总&#xff1a; GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. (github.com) 给自己的产品起一个好听的名称&#xff0c;我觉得这个是国外的企业中很好的一种文化。这里提到的苹果、黑莓等全都是一系列的水果。树莓派也有这样的风格&…

命令行程序测试自动化

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 这几天有一个小工具需要做测试&#xff0c;是一个命令行工具&#xff0c;这个命令行工具有点类似mdbg等命…

【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决

目录 一、实现登陆注册界面 1、前期准备 2、登录静态页实现 2.1、创建Vue组件 2.2、静态页面实现 2.3、配置路由 2.4、更改App.vue样式 2.5、效果 3、注册静态页实现 3.1、静态页面实现 3.2、配置路由 3.3、效果 二、axios 1、前期准备 1.1、准备项目 1.2、安装…

pytorch学习------数据集的使用方式

一、前言 在深度学习中&#xff0c;数据量通常是都非常多&#xff0c;非常大的&#xff0c;如此大量的数据&#xff0c;不可能一次性的在模型中进行向前的计算和反向传播&#xff0c;经常我们会对整个数据进行随机的打乱顺序&#xff0c;把数据处理成一个个的batch&#xff0c…

【力扣1464】数组中两元素的最大乘积

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、排序2、最值模拟 一、题目描述 题目链接&#xff1a;数组中两元素的最大乘积 给你一个整数数…

针对 SAP 的增强现实技术

增强现实技术是对现实世界的一种交互式模拟。这种功能受到各种企业和制造商的欢迎&#xff0c;因为它可以减少生产停机时间、快速发现问题并维护流程&#xff0c;从而提高运营效率。许多安卓应用都在探索增强现实技术。 使用增强现实技术&#xff08;AR&#xff09;的Liquid U…