当前位置: 首页 > 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生成包含分隔符的字符序列功能。

http://www.lryc.cn/news/419776.html

相关文章:

  • 线程池原理(一)线程池核心概述
  • 关于redisson的序列化配置
  • CentOS安装ax200驱动
  • FFMPEG Mac版本编译
  • Reactive Programing与“响应式”
  • Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升
  • 代码+视频,R语言VRPM绘制多种模型的彩色列线图
  • Python 设计模式之工厂函数模式
  • 数据赋能(171)——开发:数据挖掘——概述、关注焦点
  • L1 - OpenCompass 评测 InternLM-1.8B 实践
  • JS【详解】数据类型检测(含获取任意数据的数据类型的函数封装、typeof、检测是否为 null、检测是否为数组、检测是否为非数组/函数的对象)
  • OpenCV图像滤波(10)Laplacian函数的使用
  • docker系列11:Dockerfile入门
  • LVS(Linux virual server)详解
  • Session共享方法
  • Ubuntu 22.04 Docker安装笔记
  • 编程-设计模式 6:适配器模式
  • ERC721 概念解释
  • 数据结构(其五)--串
  • LeetCode Hot100 LRU缓存
  • GESP C++ 2024年06月一级真题卷
  • 在 Ubuntu Server 上配置静态 IP 地址
  • 数据结构——栈的讲解(超详细)
  • 三防平板助力MES系统,实现工厂移动式生产报工
  • WEB渗透Bypass篇-常规函数绕过
  • C++从入门到起飞之——string类的模拟实现 全方位剖析!
  • 数据库国产化大趋势下,还需要学习Oracle吗?
  • WebLogic
  • Aspose.Words.dll 插入模板表格,使用的是邮件合并MailMerge功能,数据源是DataTable或list对象,实例
  • 同时打开多个微信