ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JDK8字符串拼接的正确姿势

2019-03-22 21:42:42  阅读:356  来源: 互联网

标签:ids new sj 拼接 user StringJoiner JDK8 字符串 sb


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());

标签:ids,new,sj,拼接,user,StringJoiner,JDK8,字符串,sb
来源: https://www.cnblogs.com/acode/p/10581082.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有