java8 多行字符串_JDK8字符串拼接的正确姿势
1. 对列表中的元素进行拼接
以前,对一个列表中的字符串进行拼接时,常见的代码如示例1所示:
代码示例1
List ids = ImmutableList.of("1", "2", "3");
StringBuilder sb = new StringBuilder();
for (String id : ids) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(id);
}
System.out.println(sb);
运行结果
1,2,3
示例1的代码没有问题,结果也是正确的,唯一的缺憾就是:代码比较长。
在JDK8之后,上述代码可以简化:
代码实例2
List ids = ImmutableList.of("1", "2", "3");
System.out.println(String.join(",", ids));
运行结果
1,2,3
代码由原来的9行缩短到2行,非常简洁,最主要的是节省了时间(时间就是生命啊)。
JDK是如何实现的呢,源码如下:
public static String join(CharSequence delimiter, Iterable extends CharSequence> elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
原来是使用了StringJoiner,StringJoiner是JDK8为了方便构造限定分隔符,甚至于给定前缀和后缀,而提供的一个类,示例代码如下:
StringJoiner sj = new StringJoiner(",","{","}");
sj.add("first").add("second").add("third");
System.out.println(sj.toString());
运行结果
{first,second,third}
结合JDK8的stream,可以拼接列表元素:
List numbers = ImmutableList.of(1, 2, 3, 4, 5);
System.out.println(numbers.stream().map(Object::toString).collect(Collectors.joining(",")));
运行结
1,2,3,4,5
2. 追加字符串
在开发的过程中,经常遇到将字符串追加到已有的字段中,例如:将用户的一些数据追加到一个字段中。当时看到这个需求后,凭借第一印象,立即写出了如下的代码:
代码实例3
User user = new User();
StringBuilder sb = new StringBuilder(user.getRemark());
List ids = ImmutableList.of("1", "2", "3");
for (String id : ids) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(id);
}
user.setRemark(sb.toString());
System.out.println(user);
运行,竟然报空指针异常,一口老血喷了出来。通过异常信息,结合StringBuilder源码:
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
oh my god,在StringBuilder初始化时,为了初始化空间的大小,取了字符串的长度。然而,新用户的remark字段是空的,取其长度,字段就报错了。
结合前面学习的StringJoiner,新的代码如下:
User user = new User();
List ids = ImmutableList.of("1", "2", "3");
StringJoiner sj = new StringJoiner(",");
if (StringUtils.isNoneEmpty(user.getRemark())) {
sj.add(user.getRemark());
}
for (String id : ids) {
sj.add(id);
}
System.out.println(sj.toString());
运行结果
1,2,3
当然,如果还想再短一点,可以将for循环简写:
User user = new User();
List ids = ImmutableList.of("1", "2", "3");
StringJoiner sj = new StringJoiner(",");
if (StringUtils.isNoneEmpty(user.getRemark())) {
sj.add(user.getRemark());
}
sj.add(String.join(",", ids));
System.out.println(sj.toString());
java8 多行字符串_JDK8字符串拼接的正确姿势相关推荐
- java map合并_详解Java8合并两个Map中元素的正确姿势
1. 介绍 本入门教程将介绍Java8中如何合并两个map. 更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况. 2. 初始化 我们定义两个map实例 private static ...
- 【Python】字符串和变量拼接的写法
我的需求是改变url地址的后缀,其他不改,所以直接for循环,变换数字就行 也就是 字符串+变量+字符串 想着改变后缀就能批量爬图.但是原本的想法是错误的 for num in range(2,8): ...
- python 路径拼接字符串_字符串游戏之拼接字符串
出场人物介绍 小美:小学4年级学生,参加了学校的编程兴趣小组,已经了解了Python语言的基本语法,能够看懂一些简单的程序.她做事风风火火,对所有的事物都很好奇,喜欢打破砂锅问到底,是一个叫人又爱又恨 ...
- python 中文字符串分割与拼接
python 中文字符串分割与拼接 1. 中文字符串分割 path = 'D:/硕博/博士生期间资料/机器学习/机器学习课程资料/HW1/data/本纪list格式/高祖本纪.txt' with op ...
- python字符串拼接数字_解决Python中字符串和数字拼接报错的方法
解决Python中字符串和数字拼接报错的方法 前言 众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错. 如以下的代码: # co ...
- 【JS】JS中数值型字符串相加变成拼接字符串的解决方法
[JS]JS中数值型字符串相加变成拼接字符串的解决方法 参考文章: (1)[JS]JS中数值型字符串相加变成拼接字符串的解决方法 (2)https://www.cnblogs.com/xsjs/p/1 ...
- 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )
文章目录 I . 字符串定义 I . 字符串拼接 III . 字符串 API 调用 IV . 字符串 Demo 示例 I . 字符串定义 使用单引号 ' ' 和 双引号 " " 都 ...
- Java黑皮书课后题第7章:*7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目
7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目 题目 题目描述 破题 代码 运行实例 题目 题目描述 7.22(计算一个字符串中大写字母的数 ...
- java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...
字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...
最新文章
- java输出流flush操作
- VLP16线用户手册.md
- java字符串根据空格截取并存进list,并在每个元素前后加上/
- Jenkins部署Python项目实战
- SigmaStar SSD201 操作记录
- 《Python Cookbook 3rd》笔记(5.10):内存映射的二进制文件
- JavaScript的call,apply和bind方法之间的区别
- cocos2d-x之 利用富文本控件解析xhml标签(文字标签,图片标签,换行标签,标签属性)...
- python软件源 临时使用清华源
- Linux命令行常用小结
- python列表推导式使用
- C++ atuo关键字的应用 -- 尾置返回类型(trailing return type)
- 定制材料 Pd基聚多巴胺包裹碳纳米管/Fe或Cr单原子链填充Cu纳米管/Fe@CuNT和Cr@CuNT复合结构/氧化钼包裹碳纳米管纳米复合纤维
- REINFORCE和A2C的异同
- 求生之路服务器未响应,求生之路2玩起来速度快,但是过几秒后,就卡住显示未响应,这是为什么...
- 实现类似Twitter的启动动画
- EfficientNetV2 Smaller Models and Faster Training
- 阿里巴巴淘系技术:超详|2020年你不应该错过的CSS新特性
- Java本地高性能缓存的几种实现方式
- Abaqus安装python第三方库函数