用Java加入字符串集合的首选成语
给定一个字符串集合,如何在不使用外部库的情况下将它们加入普通Java中?
鉴于以下变量:
Collection data = Arrays.asList("Snap", "Crackle", "Pop"); String separator = ", "; String joined; // let's create this, shall we?
这就是我在Guava中的表现 :
joined = Joiner.on(separator).join(data);
在Apache Commons / Lang中 :
joined = StringUtils.join(data, separator);
但是在简单的Java中,真的没有比这更好的方法吗?
StringBuilder sb = new StringBuilder(); for(String item : data){ if(sb.length()>0)sb.append(separator); sb.append(item); } joined = sb.toString();
我会说最好的方法(如果最好的话,并不是说“最简洁”)而不使用Guava就是使用Guava内部使用的技术,对于你的例子看起来像这样:
Iterator iter = data.iterator(); StringBuilder sb = new StringBuilder(); if (iter.hasNext()) { sb.append(iter.next()); while (iter.hasNext()) { sb.append(separator).append(iter.next()); } } String joined = sb.toString();
这不需要在迭代时进行布尔检查,也不必对字符串进行任何后处理。
可能不是在循环中一次又一次地调用sb.length(),而是稍微修改了一下。
StringBuilder sb = new StringBuilder(); String separator = ""; for(String item : data){ sb.append(separator); separator=","; sb.append(item); } joined = sb.toString();
Java 8+
joined =
String.join(separator, data);
Java 7及以下版本
StringBuilder sb = new StringBuilder(); boolean first = true; for(String item : data){ if(!first || (first = false)) sb.append(separator); sb.append(item); } joined = sb.toString();
在Java 8中:
String.join (separator, data)
不同的意图:
对于第三方工具,例如Guava的Joiner
,它不是很快,但非常灵活 。 有许多选项方法可以自定义连接行为,例如skipNulls()
。
普通Java 速度很快 ,但它需要您自己编写一些代码行。
收集器可以加入Streams ,如果您想要filter
或map
数据,这非常有用。
String joined = Stream.of("Snap", "Crackle", "Pop") .map(String::toUpperCase) .collect(Collectors.joining(", "));
要从Collection中获取Stream,请在其上调用stream()
:
Arrays.asList("Snap", "Crackle", "Pop").stream()
你的命题是一个可能的解决方案,另一个常见的解决方案是
for (String item: data) { sb.append(item) sb.append(separator); } String joined = sb.substring(0, sb.length() - separator.length())