用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 ,如果您想要filtermap数据,这非常有用。

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