您现在的位置是:亿华云 > IT科技
字符串拼接还在用StringBuilder?快试试Java8中的StringJoiner吧,真香!
亿华云2025-10-04 03:53:31【IT科技】7人已围观
简介前言之前,我们经常会通过StringBuffer或者StingBuilder对字符串进行拼接,但是你知道Java8中推出的StringJoiner吗?它比前者更加优美、灵活,如果你现在还使用Strin
前言
之前,真香我们经常会通过StringBuffer或者StingBuilder对字符串进行拼接,字符a中但是串拼你知道Java8中推出的StringJoiner吗?它比前者更加优美、灵活,接还如果你现在还使用StringBuffer拼接,快试强烈推荐你试试StringJoiner。真香
介绍
在实用StringJoiner类之前,字符a中如果我们想要数据最终的串拼字符串以逗号隔开,大概是接还这样的
StringBuilder sb = new StringBuilder(); IntStream.range(1,10).forEach(i->{ sb.append(i+""); if( i < 10){ sb.append(",") } });如果引入StringJoiner,如何处理呢?快试
StringJoiner sj = new StringJoiner(","); IntStream.range(1,10).forEach(i->sj.add(i+""));看着是不是更简单直观了呢?
另外,StringJoiner类的真香构造函数,还可以做到可选择性地从我们自定义的字符a中前缀开始和自定义的后缀结尾,网站模板比较灵活和实用。串拼
//值依次是接还分割符 , 前缀 ,后缀 StringJoiner stringJoiner = new StringJoiner(",", "[", "]"); stringJoiner.add("xiao"); stringJoiner.add("zhi"); System.out.println(stringJoiner.toString());输出结果:[xiao,zhi]
StringJoiner在处理sql拼接上面,也非常方便,快试如拼接 sql 的in条件的时候:
StringJoiner joiner3 = new StringJoiner(",", "", ""); joiner3.add("1").add("2"); //输出 : 1,2更多实用的功能,大家可以探索。
源码
这个类的源码很简单,大家很容易就可以看明白。StringJoiner 更像一个装饰者模式,对外隐藏了StringBuilder。
不过需要注意的是 StringJoiner 并且没有处理一些基本的集合元素情况,比如加入列表的元素,更像针对Collectors而设计。服务器托管
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(); thisthis.emptyValue = this.prefix + this.suffix;//空值被设置为只有前后缀 } //设置空值,检查是否为null public StringJoiner setEmptyValue(CharSequence emptyValue) { this.emptyValue = Objects.requireNonNull(emptyValue, "The empty value must not be null").toString(); return this; } @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 initialLength value.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()); } } 高防服务器很赞哦!(43)
上一篇: 4、选择一个安全的域名注册商进行域名注册
下一篇: 公司和个人选域名方法一样吗?有什么不同?
站长推荐
尽量不要在域名中出现特殊字符,这样的域名很容易导致访问者输入错误,同时给人留下不专业的印象,降低网站的可信度,并流失大量潜在客户。
GitHub原生AI代码生成工具Copilot,官方支持Visual Studio 2022
聊聊高可用的 11 个关键技巧
什么是区块链——区块链的分布式数据库、共识机制
第六:这个圈子里的域名确实是赚钱的一些大玩家,至于小米农,有多少赚钱?几乎没有,也就是说,轿子里只有一个人,而且大多数人都抬着轿子。
如何为微服务选择数据库
2018年数据库流行度排行榜出炉,Oracle居然没有进前三!
Shiro整合springboot,freemaker,redis(含权限系统完整源码)