JDK8字符串拼接的正确姿势
1. 对列表中的元素进行拼接
以前,对一个列表中的字符串进行拼接时,常见的代码如示例1所示:
代码示例1
List<String> 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<String> 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<Integer> 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<String> 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<String> 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<String> 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());
JDK8字符串拼接的正确姿势的更多相关文章
- python 防止sql注入字符串拼接的正确用法
在使用pymysql模块时,在使用字符串拼接的注意事项错误用法1 sql='select * from where id="%d" and name="%s" ...
- python字符串拼接N种姿势
字符串大家都不陌生,应用比较广泛,强大,总是会给你一些惊喜的数据类型.我们本篇文章主要介绍的就是关于字符串的多种方法的拼接. 第一种:直接通过+号拼接 输出结果: 2.通过 str.join()方法拼 ...
- 谈谈JDK8中的字符串拼接
字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串. 在大多数的教程中,也许你会看到用+号拼接字符串 ...
- 羞,Java 字符串拼接竟然有这么多姿势
二哥,我今年大二,看你分享的<阿里巴巴 Java 开发手册>上有一段内容说:"循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作 ...
- Java 8中字符串拼接新姿势:StringJoiner
介绍 StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾.虽然这也可以在StringBuilder类的帮助 ...
- laravel-nestedset:多级无限分类正确姿势
laravel-nestedset:多级无限分类正确姿势 laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安 ...
- 2020年在项目中使用MVVM正确姿势,你用对了吗?
最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水.我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架.在这段时间的使 ...
- 【SQL】小心字符串拼接导致长度爆表
请看代码: DECLARE @max VARCHAR(max) SET @max='aaa...' --这里有8000个a +'bb' --连接一个varchar常量或变量 SELECT LEN(@m ...
- 字符串拼接 strcat ;数组和指针的区别
问题:字符串拼接 strcat 方法1: 开辟新空间,存放结果: #include <stdio.h> #include <stdlib.h> #include <str ...
随机推荐
- bwdist matlab
bwdist函数用于计算元素之间的距离. 举个例子: 如果a= 0 0 0 0 0 0 1 1 1 0 0 1 ...
- Python基础(7)——迭代器&生成器
1.列表生成式 [i*2 for i in range(10)] [fun(i) for i in range(10)] 2.生成器 # Author Qian Chenglong #列表生成器 a= ...
- 深入浅出的webpack4构建工具---比mock模拟数据更简单的方式(二十一)
如果想要了解mock模拟数据的话,请看这篇文章(https://www.cnblogs.com/tugenhua0707/p/9813122.html) 在实际应用场景中,总感觉mock数据比较麻烦, ...
- WebSocket原理与实践(三)--解析数据帧
WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...
- 【Codeforces 1137C】Museums Tour
Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...
- LeetCode263:Ugly Number
public bool IsUgly(int num) { if(num<1) return false; while(num>1) { if(num%2==0) { num=num/2; ...
- kettle学习笔记——插件的安装与使用
一.概述 暂略 二.ODPS插件 https://yq.aliyun.com/articles/68911
- 【转】Oracle virtual column(虚拟列)
为什么要使用虚拟列 (1)可以为虚拟列创建索引(Oracle为其创建function index) (2)可以搜集虚拟列的统计信息statistics,为CBO提供一定的采样分析. (3)可以在whe ...
- 实例解析forEach、for...in与for...of
在开发过程中经常需要循环遍历数组或者对象,js也为我们提供了不少方法供使用,其中就有三兄弟forEach.for...in.for...of,这三个方法应该是使用频率最高的,但很多人却一值傻傻分不清, ...
- 原创超清的 Webpack2 视频教程
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...