所以我一直在回顾我差不多一年半前写的代码,试图修复它,我发现这个功能让我感到困惑。我搜索了一个方法来做同样的事情,发现了一个相当不错的功能,我很好奇什么会更好。
功能A:
public static String listToString(List<String> list){
StringBuilder sb = new StringBuilder();
if (list != null && list.size() > 1){
sb.append(list.get(0));
for (int i = 1; i < list.size(); i++){
sb.append(", " + list.get(i));
}
}else if(list != null && (list.size() == 1)){
sb.append(list.get(0));
}
return sb.toString();
}
功能B:
public static String listToString(List<String> list) {
String str = "";
for (String s : list) {
str += s + ", ";
}
return str;
}
现在我在学习Java的前几个月内编写了函数A,所以我可能不太了解,但是我有什么理由坚持使用这种方法吗?
答案 0 :(得分:1)
函数A是首选,因为它只使用一个StringBuilder实例,而函数B中的代码在循环中执行
str += s + ", ";
相当于
str = new StringBuilder(str).append(s).append(", ").toString();
所以在每次迭代中你必须:
", "
和s
(所以在每次迭代中你需要再次读取整个字符串,然后再次......)在场景B中你只需要专注于为单个StringBuilder添加新字符
无论如何,自Java 8以来,你不需要把重点放在编写可以连接字符串集合的方法上。你可以简单地使用StringJoiner
类或简单地调用
来自String类的join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
方法将为您使用StringJoiner
。此方法的代码如下所示:
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();
}
请注意,Objects.requireNonNull(delimiter);
会在null
的情况下抛出NPE,因此如果您想避免它,您可以编写自己的此方法版本并将此测试替换为更像
if (delimiter==null || elements==null) return "";
或者如果您想允许分隔符为空
if (elements==null) return "";
if (delimiter == null) delimiter = "";//use empty string as delimiter
答案 1 :(得分:1)
Apache的公共语言,只需附加
StringUtils.join(list);
或 按字符分隔。
StringUtils.join(java.lang.Iterable,char)
Java 8.0 以后,第一个参数是分开元素
String joined = String.join("", list);
答案 2 :(得分:1)
检查番石榴上的Joiner
String s= Joiner.on(",").join(lists);
检查以下输出测试
List<String> lists=new ArrayList<String>();
lists.add("a1");
lists.add("a2");
lists.add("a3");
lists.add("a4");
String s = Joiner.on(",").join(lists);
System.out.println(s);
输出中:
a1,a2,a3,a4
答案 3 :(得分:0)
除了使用库,您还可以使用
(我经常看到的模式)
public static String listToString(List<String> list) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String string : list) {
if (first)
first = false;
else
sb.append(", ");
sb.append(string);
}
return sb.toString();
}
(也很常见)
public static String listToString(List<String> list) {
StringBuilder sb = new StringBuilder();
String separator = "";
for (String string : list) {
sb.append(separator).append(string);
separator = ", ";
}
return sb.toString();
}
(最短,有点难读)
public static String listToString(List<String> list) {
StringBuilder sb = new StringBuilder();
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();)
sb.append(iterator.next()).append(iterator.hasNext() ? ", " : "");
return sb.toString();
}
(可能是最快的,因为循环中没有额外的条件跳转)
public static String listToString(List<String> list) {
StringBuilder sb = new StringBuilder();
Iterator<String> iterator = list.iterator();
if (iterator.hasNext()) {
sb.append(iterator.next());
while (iterator.hasNext())
sb.append(", ").append(iterator.next());
}
return sb.toString();
}
或其他可读的东西像B一样短,但使用StringBuilder
。您不想要的是循环中的+
字符串连接。这会创建临时对象。