JDK8字符串拼接的正确姿式

1. 对列表中的元素进行拼接

之前,对一个列表中的字符串进行拼接时,常见的代码如示例1所示:app

代码示例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以后,上述代码能够简化:ui

代码实例2

List<String> ids = ImmutableList.of("1", "2", "3");
        System.out.println(String.join(",", ids));

运行结果

1,2,3

代码由原来的9行缩短到2行,很是简洁,最主要的是节省了时间(时间就是生命啊)。指针

JDK是如何实现的呢,源码以下:code

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为了方便构造限定分隔符,甚至于给定前缀和后缀,而提供的一个类,示例代码以下:element

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. 追加字符串

在开发的过程当中,常常遇到将字符串追加到已有的字段中,例如:将用户的一些数据追加到一个字段中。当时看到这个需求后,凭借第一印象,当即写出了以下的代码:rem

代码实例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,新的代码以下:get

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());
相关文章
相关标签/搜索