连接String对象列表的最佳方法是什么?我想这样做:
ListsList = new ArrayList (); // add elements if (sList != null) { String listString = sList.toString(); listString = listString.subString(1, listString.length() - 1); }
我不知何故发现这比使用StringBuilder/StringBuffer方法更整洁.
有什么想法/意见吗?
使用Apache Commons Lang中的StringUtils.join方法之一.
import org.apache.commons.lang3.StringUtils; String result = StringUtils.join(list, ", ");
如果你有幸使用Java 8,那么它就更容易了......只需使用String.join
String result = String.join(", ", list);
使用Java 8+
String str = list.stream().collect(Collectors.joining())
甚至
String str = String.join("", list);
您的方法依赖于Java的ArrayList#toString()实现.
虽然Java API中记录了实现并且不太可能发生变化,但它有可能实现.自己实现它更可靠(循环,StringBuilders,递归,无论你更喜欢什么).
当然,这种方法可能看起来"更整洁"或更"太甜"或"钱",但在我看来,这是一种更糟糕的方法.
关于codefin的答案的变化
public static String concatStringsWSep(Iterablestrings, String separator) { StringBuilder sb = new StringBuilder(); String sep = ""; for(String s: strings) { sb.append(sep).append(s); sep = separator; } return sb.toString(); }
如果您正在为Android开发,TextUtils.join
则由SDK提供.
这是迄今为止我发现的最优雅,最干净的方式:
list.stream().collect(Collectors.joining(delimiter));
Guava是来自Google的一个非常简洁的图书馆:
Joiner joiner = Joiner.on(", "); joiner.join(sList);
我更喜欢Java 8中的String.join(list)
您是否看到过此Coding Horror博客条目?
微观优化剧院的悲剧
我不确定它是否“更整洁”,但是从性能的角度来看,这可能无关紧要。
在我看来,StringBuilder将快速有效。
基本形式如下所示:
public static String concatStrings(Liststrings) { StringBuilder sb = new StringBuilder(); for(String s: strings) { sb.append(s); } return sb.toString(); }
如果这太简单了(可能是这样),则可以使用类似的方法并添加如下分隔符:
public static String concatStringsWSep(Liststrings, String separator) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < strings.size(); i++) { sb.append(strings.get(i)); if(i < strings.size() - 1) sb.append(separator); } return sb.toString(); }
我同意回答这个问题的其他人所说的,您不应依赖Java ArrayList的toString()方法。