JAVA8——StringJoiner类

引言:在阅读项目代码是,突然看到了StringJoiner这个类的使用,感觉很有意思,对实际开发中也有用,实际上是运用了StringBuilder的一个拼接字符串的封装处理。

介绍

StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。
我们查看一下一下代码,试着猜一下。

StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();

代码输出为[George:Sally:Fred]

源码

这个类的源码很简单,大家很容易就可以看明白。

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;}@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;}}}初始化,先添加前缀,有了之后每次先添加间隔符,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());}
}

JAVA8——StringJoiner类相关推荐

  1. java8 时间类API

    前言 Instant LocalDate Clock SystemnanoTime 前言 (未完待续) 推荐一篇系统学习的java8时间类文章 我这里会介绍java8 新API中常用个类怎么用 应该是 ...

  2. 使用Java8 Files类读写文件

    Java8 Files类的newBufferedReader()和newBufferedWriter()方法 这两个方法接受Path类型的参数.Path 类是Java8 NIO中的接口.可以由Path ...

  3. java8时间类的好处_Java8——时间类

    一套新的时间API,放在java.time包下面 比之前的更加规范,并且解决了线程安全问题(最大区别) 线程安全问题 public classSimpleDateFormatTest {public ...

  4. Java8 Optional类用法

    文章目录 API介绍 第一组 Optional(T value) empty() of(T value) ofNullable(T value) 第二组 orElse(T other),orElseG ...

  5. java8 collectors类_java8之collectors

    java8中提供了对集合进行转化,然后进行归集的的操作.这就不得不提Collectors这个类了,真的很强大,我们看示例吧. KeyAndValue a1 = newKeyAndValue().set ...

  6. spring boot添加 LocalDateTime 等 java8 时间类序列化和反序列化的支持

    由于项目将原有的  Date类型的字段改造为 LocalDate,LocalDateTime,LocalTime 类型, 发现  spring  对项目的时间格式无法自动转换,故需手动配置下. 在sp ...

  7. 新容器!不再担心空指针, Java8 Optional类

    Optional<T>类(java.util.Optional)是一个容器类,它可以保存类型T的值,代表这个值存在.或者仅仅保存null,表示这个值不存在.原来用 null 表示一个值不存 ...

  8. Java8 Optional类

    概述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guav ...

  9. java8——Optinal类

    Optional介绍 我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointExcepti ...

  10. Java8处理时间类

    Java 8 已经普遍使用了,可是还在有人用 Java Calendar 处理时间和日期,不仅仅性能差,很切代码很冗余,就不能用 Java 8  提供的新 API 吗?所以 CTO 强制了,必须用 J ...

最新文章

  1. SLAM的通用框架:GSLAM
  2. linux 判断某个命令是否安装
  3. Linux shell脚本判断服务器网络是否可以上网
  4. python创建csv文件并写入-【已解决】Python中创建和保存数据到csv文件中
  5. CubieBoard开发板不用ttl线也不用hdmi线的安装方法
  6. 程序员的成功是否有规律可循?
  7. jmeter mysql查询结果提取_Jmeter-从数据库中获取数据并作为变量使用
  8. coxphfit+matlab,Cox Proportional Hazards Model
  9. 110 redis的哨兵集群 redis-cluster docker安装
  10. CSDN小秘书 测试版
  11. Mimics:修改像素单位
  12. 致远项目管理SPM系统之合同基本信息管理
  13. 漫画追踪器Tracker
  14. linux 打印文件目录结构,linux基本文件目录的结构及管理
  15. python连通区域计算长度_连通区域算法小结
  16. Unity 2D 入门
  17. 90岁的褚时健退休了,我们能够从褚老身上学到些什么?
  18. sicily 9562 SUME
  19. 瑞红淘宝商城旗舰店开张 正式进军B2C市场
  20. html5模板 欧美风格,红色欧美风格响应式后台系统网页模板

热门文章

  1. 【App 开发框架 - App Framework】
  2. XCode下的iOS单元测试
  3. 阿里开发者们的第15个感悟:做一款优秀大数据引擎,要找准重点解决的业务场景... 1
  4. 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
  5. js 定义函数的几种方法 以及如何调用
  6. Elastic Search Java Api 创建索引结构,添加索引
  7. 无法创建新虚拟机: 无法打开配置文件“E:\vmware\Windows7.vmx”: 拒绝访问。
  8. asp.net 4高级程序设计( 第4版)文摘
  9. js-数据类型和变量
  10. 23. 客户默认选项(Default Customer Options)