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字符串拼接的正确姿势的更多相关文章

  1. python 防止sql注入字符串拼接的正确用法

    在使用pymysql模块时,在使用字符串拼接的注意事项错误用法1 sql='select * from where id="%d" and name="%s" ...

  2. python字符串拼接N种姿势

    字符串大家都不陌生,应用比较广泛,强大,总是会给你一些惊喜的数据类型.我们本篇文章主要介绍的就是关于字符串的多种方法的拼接. 第一种:直接通过+号拼接 输出结果: 2.通过 str.join()方法拼 ...

  3. 谈谈JDK8中的字符串拼接

    字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串. 在大多数的教程中,也许你会看到用+号拼接字符串 ...

  4. 羞,Java 字符串拼接竟然有这么多姿势

    二哥,我今年大二,看你分享的<阿里巴巴 Java 开发手册>上有一段内容说:"循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作 ...

  5. Java 8中字符串拼接新姿势:StringJoiner

    介绍 StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾.虽然这也可以在StringBuilder类的帮助 ...

  6. laravel-nestedset:多级无限分类正确姿势

    laravel-nestedset:多级无限分类正确姿势   laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安 ...

  7. 2020年在项目中使用MVVM正确姿势,你用对了吗?

    最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水.我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架.在这段时间的使 ...

  8. 【SQL】小心字符串拼接导致长度爆表

    请看代码: DECLARE @max VARCHAR(max) SET @max='aaa...' --这里有8000个a +'bb' --连接一个varchar常量或变量 SELECT LEN(@m ...

  9. 字符串拼接 strcat ;数组和指针的区别

    问题:字符串拼接 strcat 方法1: 开辟新空间,存放结果: #include <stdio.h> #include <stdlib.h> #include <str ...

随机推荐

  1. [转]Qt状态栏(statusbar)的使用

    状态栏显示的信息分3种 1. 一般信息,用QLabel 代表 2. 永久信息,文本会一直显示在状态栏的最右边. 3. 临时信息,指定信息现实的时间.时间到即信息消失 QLabel *locationL ...

  2. Linux加密、安全版块、root密码破解

    当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍),通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看 ...

  3. HTTPS深入理解

    HTTPS = HTTP + TLS

  4. java 面向对象基本概念

    1.面向对象与面向过程 (1).都是解决问题的思维方式,都是代码组织的方式. (2).解决简单问题可以使用面向过程 (3).解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 2.面向对 ...

  5. Crowdsourcing[智能辅助标注]

    为了实现标注平台智能辅助标注的能力,即上传一个标注任务,开始不提供辅助任务,随着用户标注的进行,后台可以收集一部分的标记数据,然后开启模型训练,并接着提供模型服务功能.然后再收集数据,再不断的训练,然 ...

  6. Tensorflow[源码安装时bazel行为解析]

    0. 引言 通过源码方式安装,并进行一定程度的解读,有助于理解tensorflow源码,本文主要基于tensorflow v1.8源码,并借鉴于如何阅读TensorFlow源码. 首先,自然是需要去b ...

  7. HTTP-从输入url到请求回数据发生了什么

  8. WPF中的Bitmap与byte

    原文:WPF中的Bitmap与byte public MainWindow() { InitializeComponent(); byte[] b = GetPictureData(@"F: ...

  9. 2-SAT超入门讲解

    Preface 说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的 还有一些板子题,由于是暑假的时候学的所以有些我也记不清了 主要学习参考自:Mancher的课件&& ...

  10. java 双因素认证(2FA)TOTP demo

    TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password).它是公认的可靠解决方案,已经写入国际标准 RFC6238. 很早就知道有这个 ...