当前位置: 首页 > news >正文

StringJoiner更优雅创建含分隔符的字符序列

文章目录

    • 1 why
    • 2 what
    • 3 how
    • 4 练习手段

1 why

  StringBuilder拼接包含分隔符的字符序列时,分隔符需要一个一个添加,或者需要手动删除末尾冗余的分隔符,代码不美观,不好看。

  比如,单个字符串依次拼接时:

StringBuilder sb = new StringBuilder();
sb.append("apple");
sb.append(",");
sb.append("orange");
sb.append(",");
sb.append("milk");
String str = sb.toString();

  以及字符串集合循环拼接时:

StringBuilder sb = new StringBuilder();
for (String s:foodList) {sb.append(s);sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
String str = sb.toString();

  StringJoiner很好的解决了这个问题。

2 what

  StringJoiner:用于构造由分隔符分隔的字符序列,并且可选前缀、后缀。内部实际是基于StringBuilder实现。

  由于本文只使用StringJoiner替换StringBuilder,生成带分隔符的字符序列,所以与之无关的功能不介绍,详情可以参见jdk1.8官网手册。

StringJoiner功能
  如图,需要用到的有StringJoiner本身提供的StringJoiner构造方法、add方法、toString方法,以及String类中通过StringJoiner实现的join方法。

  (1)StringJoiner构造方法

public StringJoiner(CharSequence delimiter) {this(delimiter, "", "");
}

  创建对象时,可以指定分隔符。

  (2)add方法

public StringJoiner add(CharSequence newElement) {prepareBuilder().append(newElement);return this;
}

  外层使用的prepareBuilder()方法,及StringBuilder的append方法,继续查看prepareBuilder方法:

private StringBuilder prepareBuilder() {if (value != null) {value.append(delimiter);} else {value = new StringBuilder().append(prefix);}return value;
}

  也是用的StringBuilder的append方法,区别是增加了prefix(前缀,用于在输出的字符序列最前面添加用户自定义的字符,比如[)。

  (3)toString方法

@Override
public 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;}}
}

(4)String类的join方法

public static String join(CharSequence delimiter, CharSequence... elements) {Objects.requireNonNull(delimiter);Objects.requireNonNull(elements);// Number of elements not likely worth Arrays.stream overhead.StringJoiner joiner = new StringJoiner(delimiter);for (CharSequence cs: elements) {joiner.add(cs);}return joiner.toString();
}

  可以看到实际是调用StringJoiner实现的。

  此处,实现了suffix(分隔符)的填充操作。

  至此介绍完毕相关功能,后面进行尝试。

3 how

  (1)单个字符串依次拼接时:

  简单字符,可直接使用String类的join方法。

String result = String.join(",", "aaa", "bbb" ,"ccc");

  第一个入参是分隔符,后面依次添加要追加的字符串。

  字符串内容复杂时,使用StringJoiner。

StringJoiner sj = new StringJoiner(",");
sj.add("apple");
sj.add("orange");
sj.add("milk");
String str = sj.toString();

  (2)字符串集合循环拼接时:

List<String> foodList = new ArrayList<String>();
foodList.add("apple");
foodList.add("orange");
foodList.add("milk");StringJoiner sj = new StringJoiner(",");
for (String s:foodList) {sj.add(s);
}
String str = sj.toString();

  和一开始StringBuilder的方式比较下,是不是简洁许多?

4 练习手段

  可以参照“3 how”章节,尝试在自己的项目中,替换原本使用StringBuilder生成包含分隔符的字符序列功能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • k8s数据卷(volume)管理
  • 深度学习 - 数据存储形式对比(pkl/CSV/JSON等)
  • 设计模式的概念
  • qt-声明、宏
  • 【深度学习】【语音】TTS,Matcha-TTS,测试效果,训练中文,chinese
  • YOLOv8添加MobileViTv3模块(代码+free)
  • 指针基础知识(笔记)
  • 用uniapp 及socket.io做一个简单聊天app 踢人拉黑 7
  • 2024年计算机类学术会议有哪些
  • 什么是oled?
  • 初识增强现实(AR)
  • ubuntu20从docker安装到制作自己的镜像使用记录
  • leetcode数论(2521. 数组乘积中的不同质因数数目)-质因素分解
  • 垃圾收集器
  • 【Linux】(32)详解命名管道 | 日志管理 | 进程池2.0
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [case10]使用RSQL实现端到端的动态查询
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 《Java编程思想》读书笔记-对象导论
  • 【Amaple教程】5. 插件
  • Asm.js的简单介绍
  • CEF与代理
  • JavaScript的使用你知道几种?(上)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Making An Indicator With Pure CSS
  • php的插入排序,通过双层for循环
  • Python学习之路16-使用API
  • Redux系列x:源码分析
  • socket.io+express实现聊天室的思考(三)
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 百度地图API标注+时间轴组件
  • 当SetTimeout遇到了字符串
  • 记录一下第一次使用npm
  • 物联网链路协议
  • 小程序 setData 学问多
  • 在weex里面使用chart图表
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​如何使用QGIS制作三维建筑
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # .NET Framework中使用命名管道进行进程间通信
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (2)MFC+openGL单文档框架glFrame
  • (35)远程识别(又称无人机识别)(二)
  • (Git) gitignore基础使用
  • (Java数据结构)ArrayList
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (待修改)PyG安装步骤
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (六)Hibernate的二级缓存
  • (十一)c52学习之旅-动态数码管
  • (推荐)叮当——中文语音对话机器人
  • (未解决)macOS matplotlib 中文是方框
  • (已解决)什么是vue导航守卫
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)