【字符串工具类】StringJoiner使用详解

关于StringJoiner

    • 1.介绍
    • 2.源码
      • 2.1 属性
      • 2.2 方法
    • 3 举例
      • StringJoiner做法
      • 3.1 只含间隔符
      • 3.2 含间隔符和前后缀
      • 3.3 merge合并两个joiner
      • 3.4 stringJoiner.setEmptyValue("xxx");
      • 3.5 综合举例+length()方法

1.介绍

  • 在JDK1.8之后,提供了一个StringJoiner类用来进行字符串拼接处理,其可以在初始化的时候指定分隔符和前缀后缀;

  • 实现逻辑和StringBuilder基本是一样的逻辑,另外加入了前缀后缀、多了一个merge的功能;

  • 作用:处理字符串拼接的工具类;

  • 好处:比StringBuilder和StringBuffer更加方便、便捷、优雅;

2.源码

源码:
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) {//间隔符,前缀和后缀判断是否为null,null将抛出异常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"); // 成员变量赋值this.prefix = prefix.toString();this.delimiter = delimiter.toString();this.suffix = suffix.toString();this.emptyValue = this.prefix + this.suffix;//空值被设置为只有前后缀}//设置空值,检查是否为nullpublic StringJoiner setEmptyValue(CharSequence emptyValue) {this.emptyValue = Objects.requireNonNull(emptyValue,"The empty value must not be null").toString();return this;}
--toString()方法@Overridepublic String toString() {if (value == null) {return emptyValue;//没有值将返回空值或者后续设置的空值} else {if (suffix.equals("")) {return value.toString();//后缀为""直接返回字符串,不用添加} else {//后缀不为"",添加后缀,然后直接返回字符串,修改长度int initialLength = value.length();String result = value.append(suffix).toString();// reset value to pre-append initialLengthvalue.setLength(initialLength);return result;}}}
--add元素开始进行初始化,先添加前缀,有了之后每次先添加间隔符,StringBuilder后续append字符串public StringJoiner add(CharSequence newElement) {prepareBuilder().append(newElement);return this;}
--合并StringJoiner,注意后面StringJoiner 的前缀就不要了,后面的appen进来public StringJoiner merge(StringJoiner other) {Objects.requireNonNull(other);if (other.value != null) {final int length = other.value.length();// lock the length so that we can seize the data to be appended// before initiate copying to avoid interference, especially when// merge 'this'StringBuilder builder = prepareBuilder();builder.append(other.value, other.prefix.length(), length);}return this;}//初始化,先添加前缀,有了之后每次先添加间隔符private StringBuilder prepareBuilder() {if (value != null) {value.append(delimiter);} else {value = new StringBuilder().append(prefix);}return value;}
--拿长度 拿的是加了间隔符和前后缀后的长度,若无元素拼接则不算间隔符长度(详情见下面分析)public int length() {// Remember that we never actually append the suffix unless we return// the full (present) value or some sub-string or length of it, so that// we can add on more if we need to.//不忘添加后缀的长度return (value != null ? value.length() + suffix.length() :emptyValue.length());}
}

2.1 属性

  • prefix:拼接后的字符串前缀
  • delimiter:拼接时的字符串分隔符
  • suffix:拼接后的字符串后缀
  • value:拼接后的值
  • emptyValue:空值的情况,value为null时返回

2.2 方法

  • setEmptyValue():设置空值
  • toString():转换成String
  • add():添加字符串
  • merge():从另一个StringJoiner合并
  • length():长度(包括前后缀)

3 举例

  • 举例:把一个字符串集合使用 “ ,”(逗号)分隔开;
  • 先看之前的StringBuilder做法
# StringBuilder做法
String a = "a", b = "b", c = "c";
List<String> list = new ArrayList<>();
list.add(a);
list.add(b);
list.add(c);
String s=""
StringBuilder builder = new StringBuilder();
list.forEach(s -> builder.append(s).append(","));
// 最后在处理掉多余的","
System.out.println(builder.toString().substring(0, builder.length() - 1));
// 输出结果:a,b,c

StringJoiner做法

参数不同,使用不同(调用的构造函数不同,呈现的用法不同)

3.1 只含间隔符

StringJoiner stringJoiner=new StringJoiner(",")把字符串根据“,”进行拼接

stringJoiner.add("a");
stringJoiner.add("b");
stringJoiner.add("c");
System.out.println(stringJoiner);//a,b,c

3.2 含间隔符和前后缀

StringJoiner stringJoiner=new StringJoiner(",","[","]"); 字符串 根据"," 拼接,并且用 "[" 和 "]" 包住首尾

stringJoiner.add("a");
stringJoiner.add("b");
stringJoiner.add("c");
System.out.println(stringJoiner);//[a,b,c]

3.3 merge合并两个joiner

merge的思路是用当前的stringJoiner去append other的value,merge时去掉前后缀只进行value的拼接;
merger后加上前后缀,比如A merge B,那么最后就加上A的前后缀,且进行value拼接的时候连接A和B使用的是A的拼接符

StringJoiner stringJoiner1=new StringJoiner(":","[","]");
StringJoiner stringJoiner2=new StringJoiner(".","(",")");
stringJoiner1.add("a").add("b").add("c");
stringJoiner2.add("d").add("e").add("f");
System.out.println(stringJoiner1);//[a:b:c]
System.out.println(stringJoiner2);//(d.e.f)
stringJoiner1.merge(stringJoiner2);//[a:b:c:d.e.f]

3.4 stringJoiner.setEmptyValue(“xxx”);

设置空值,目的我们在源码中可以看出,在无拼接元素的时候也就是valu为空时,返回的是这个emptyValue的值/长度

3.5 综合举例+length()方法

StringJoiner stringJoiner1=new StringJoiner(":","[","]");
StringJoiner stringJoiner3=new StringJoiner("*");
--无元素拼接 含前后缀
System.out.println(stringJoiner1.length());//2(前后缀长度)
System.out.println(stringJoiner1);//[]
--无元素拼接 只含间隔符
System.out.println(stringJoiner3.length());//0(无元素拼接时,间隔符不算,前后缀算)
System.out.println(stringJoiner3);//空(什么也没有)
--加上元素拼接 
stringJoiner1.add("a").add("b");
System.out.println(stringJoiner1.length());//5
System.out.println(stringJoiner1);//[a:b]
--设置emptyValue (此时stringjoiner3无元素拼接,再设置emptyValue后返回的是empty的长度和值)
stringJoiner3.setEmptyValue("123456");
System.out.println(stringJoiner3.length());//6
System.out.println(stringJoiner3);//123456

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

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

相关文章

洛谷:线性表

今天开始刷洛谷&#xff0c;之前刷leetcode都是核心代码模式&#xff0c;现在突然让我用ACM模式&#xff0c;刚开始还是很不习惯的&#xff0c;但做了几道题好点了&#xff0c;只能说洛谷题的难度是比leetcode大的。 还有就是&#xff0c;STL牛逼&#xff01; 1.询问学号(vect…

具有权威性的工信部证书怎么考

工信部证书的考试流程如下&#xff1a; 选择正规报考机构&#xff1a;选择一家权威的培训机构或考试中心&#xff0c;确保其具有相应的资质和经验。 提交个人报考资料&#xff1a;根据考试机构的要求&#xff0c;提交相关的个人报考资料&#xff0c;如身份证、学历证明、工作…

【kubernetes】集群网络(一):基础篇

Flannel 1 路由表 & arp & fdb 1.1 路由表 任何网络设备都需要路由表&#xff0c;路由表用来决定&#xff0c;当收到数据包时&#xff0c;该向哪里进行转发。路由表项通常会包含以下几个字段&#xff1a; Destination&#xff1a;目的地Gateway&#xff1a;网关Mas…

【DDD领域驱动篇】如何理解领域驱动设计?

如何理解领域驱动设计? ✔️典型解析✔️扩展知识仓库✔️DDD带来的好处✔️DDD 的不足 ✔️典型解析 领域动设计(Domain-Driven Design&#xff0c;DDD)是一种软件开发方法论&#xff0c;将业务领域作为软件设计的核心&#xff0c;以便更好地满足业务需求。 DDD认为&#xff…

Hive和Spark生产集群搭建(spark on doris)

1.环境准备 1.1 版本选择 序号bigdata-001bigdata-002bigdata-003bigdata-004bigdata-005MySQL-8.0.31mysqlDataxDataxDataxDataxDataxDataxSpark-3.3.1SparkSparkSparkSparkSparkHive-3.1.3HiveHive 1.2 主要组件官网 hive官网&#xff1a; https://hive.apache.org/ hive…

数据结构学习 Leetcode322 零钱兑换

关键词&#xff1a;动态规划 完全背包 记忆化搜索 一个套路&#xff1a; 01背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要逆序遍历完全背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要正序遍历 题目&#xff1a; 方法一&#xff…

【Linux】Linux服务器ssh密钥登录

ssh密码登录 ssh root地址 #需要输入密码ssh密钥登录 Linux之间密钥登录 生成公私钥 #生成公钥私钥 ssh-keygen #默认目录&#xff0c;默认密码空ssh-copy-id #拷贝ID到目标服务器 ssh-copy-id -i id_rsa.pub root192.168.8.22 ssh-copy-id -i id_rsa.pub root192.168.8.33…

把这些软件测试经典面试题!全背下来,拿offer就像喝水一样!

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&am…

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…

无法连接虚拟机设备 ide1:0,因为主机上没有相应的设备。您要每次在开启此虚拟机时都尝试连接此虚拟设备吗?

Vmware报错&#xff1a; 报错原因&#xff1a; ide1:0一般是虚拟机的光驱&#xff0c;配置选项是“使用物理驱动器”&#xff0c;而宿主机可能没有安装光驱&#xff0c;故无法从驱动器上寻找 .ISO 系统文件。 解决方法: 右键点击对应的虚拟机&#xff0c;再点击“设置”按钮。…

Flask 拦截器

登录实现后&#xff0c;有很多页面还没有进行设置登录要求&#xff0c;即使没有登录也可以到页面中来&#xff0c;当页面多了以后&#xff0c;每个页面都进行设置又非常繁琐&#xff0c;所以这里用到了 Flask 拦截器 相关资料源码来自编程浪子的Flask点餐小程序系统 web/inte…

案例195:基于微信小程序的购物商城系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中&#xff0c;可以将【参数】放在【路由路径】中&#xff0c; 从而实现&#xff0c;同一个 路由&#xff0c;同一个组件&#xff0c;因路径参数不同&#xff0c;可以渲染出不同的内容。特点 &#xff1a; 1、当携带不同路径参数的路由相互跳转时&am…

【论文阅读】Realtime multi-person 2d pose estimation using part affinity fields

OpenPose&#xff1a;使用PAF的实时多人2D姿势估计。 code&#xff1a;GitHub - ZheC/Realtime_Multi-Person_Pose_Estimation: Code repo for realtime multi-person pose estimation in CVPR17 (Oral) paper&#xff1a;[1611.08050] Realtime Multi-Person 2D Pose Estima…

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

NLP论文阅读记录 - 02 | 2022 自动文本摘要方法:综合回顾

文章目录 前言0、论文摘要一、Introduction1.1文本摘要的要求1.2主要研究贡献 二.ATS的分类2.1基于没有。输入文档的数量2.2 基于总结方法2.3 基于输出摘要性质&#xff1a;2.4 基于摘要语言2.4.1 基于摘要算法2.5 基于摘要内容2.6 基于摘要类型2.7 基于概括域2.8 基于加工水平…

Your password does not satisfy the current policy requirements

密码策略问题异常信息&#xff1a; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements1、查看 mysql 初始的密码策略&#xff0c; 输入语句 “ SHOW VARIABLES LIKE validate_password%; ” 进行查看 2.首先需要设置密码的验证强度等级&am…

如何查看官方文档(第410篇)

让自己更加值钱,考专业证,提升学历,提升专业技能。 一 让AI告诉你 如何查看官方文档(第410篇) 要查看MySQL官方文档的详细过程,可以按照以下步骤进行: 1. 打开MySQL官方文档的主页:https://dev.mysql.com/doc/refman/2. 在搜索框中输入您要查找的主题,并按Enter键。3.…

React Query 实战教程:在 React 中如何优雅的管理接口数据状态?

前言 如何通过Ajax或者Fetch优雅的请求后端接口&#xff0c;这是所有复杂前端项目都需要考虑处理的事情。在React项目中&#xff0c;有不少成熟的Hook能够让开发者管理整个请求过程中的数据和状态&#xff0c;例如 axios-hooks、use-http、react-query、swr甚至 ahook中提供的…

嵌入式开发——GD32F4的I2C查询

SCL SDA TXFRAME SMBA I2C0 PB6,PB8 PB7,PB9 PB4 PB5 I2C1 PB10,PF1,PH4 PF0,PH5,PB11,PC12,PB3 PF3,PH3,PB13 PF2,PH6,PB12 I2C2 PA8,PH7 PH8,PC9,PB4 PA10,PH10 PA9,PH9