用Java加入字符串集合的首选成语

时间:2011-02-08 08:27:48

标签: java string collections

给定一个字符串集合,如何在不使用外部库的情况下将它们加入普通Java?

鉴于这些变量:

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

7 个答案:

答案 0 :(得分:16)

我会说最佳这样做的方式(如果最好的话,你不是说“最简洁”)而不使用Guava就是使用Guava在内部使用的技术,对于你的例子来说看起来像这样:

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

这不需要在迭代时进行布尔检查,也不必对字符串进行任何后处理。

答案 1 :(得分:10)

可能不是在循环中一次又一次地调用sb.length(),而是稍微修改过。

StringBuilder sb = new StringBuilder();
String separator = "";
for(String item : data){
    sb.append(separator);
    separator=",";
    sb.append(item);
}
joined = sb.toString();

答案 2 :(得分:8)

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

答案 3 :(得分:5)

在Java 8中:

String.join (separator, data)

答案 4 :(得分:1)

不同的意图:

对于第三方工具,例如Guava的Joiner,它不是很快,但非常灵活。有许多选项方法可以自定义连接行为,例如skipNulls()

普通Java ,但它需要您自己编写一些代码行。

答案 5 :(得分:1)

Collectors可以加入Streams,如果您想要filtermap您的数据,这非常有用。

String joined = Stream.of("Snap", "Crackle", "Pop")
        .map(String::toUpperCase)
        .collect(Collectors.joining(", "));

要从集合中获取流,请在其上调用stream()

Arrays.asList("Snap", "Crackle", "Pop").stream()

答案 6 :(得分:0)

你的命题是一个可能的解决方案,另一个常见的解决方案是:

for (String item: data) {
    sb.append(item)
    sb.append(separator);
}
String joined = sb.substring(0, sb.length() - separator.length())