之前,对一个列表中的字符串进行拼接时,常见的代码如示例1所示:app
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
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
在开发的过程当中,常常遇到将字符串追加到已有的字段中,例如:将用户的一些数据追加到一个字段中。当时看到这个需求后,凭借第一印象,当即写出了以下的代码:rem
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());