当前位置:  开发笔记 > 编程语言 > 正文

连接String对象列表的最佳方法是什么?

如何解决《连接String对象列表的最佳方法是什么?》经验,为你挑选了10个好方法。

连接String对象列表的最佳方法是什么?我想这样做:

List sList = new ArrayList();

// add elements

if (sList != null)
{
    String listString = sList.toString();
    listString = listString.subString(1, listString.length() - 1);
}

我不知何故发现这比使用StringBuilder/StringBuffer方法更整洁.

有什么想法/意见吗?



1> Jeff Olson..:

使用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);


是的,每一次:Bloch,"Effective Java",第47项:"了解并使用库".Apache Commons库应该是第一个放入构建文件的东西(希望是Gradle).正如第47项所述:"总而言之,不要重新发明轮子".
使用Guava API:`Joiner.on(',').skipNulls().join(Iterable <?>)`.要表示空值,可以使用`Joiner.on(',').useForNull("#").join(Iterable <?>)`

2> Andrei N..:

使用Java 8+

String str = list.stream().collect(Collectors.joining())

甚至

String str = String.join("", list);



3> Jack Leow..:

您的方法依赖于Java的ArrayList#toString()实现.

虽然Java API中记录了实现并且不太可能发生变化,但它有可能实现.自己实现它更可靠(循环,StringBuilders,递归,无论你更喜欢什么).

当然,这种方法可能看起来"更整洁"或更"太甜"或"钱",但在我看来,这是一种更糟糕的方法.


我同意我不喜欢OP的做法,但出于不同的原因.(1)这样做可以伪装代码的意图(而像StringUtils.join`这样的东西是完全可读的).(2)它不灵活,因为您可能想要更改分隔符.(只是替换`","在最后一个字符串中``不是一个好方法,因为可能有``,'`嵌入在原始字符串中.)所以即使如你所说,`ArrayList.toString`可能赢了不会改变,我仍然不会走这条路.
您可以99.9%确定ArrayList.toString不会改变,除非它以某种方式成为攻击向量; 向后兼容性将会看到.但我同意使用toString()仍然是一个坏主意.

4> Peter Lawrey..:

关于codefin的答案的变化

public static String concatStringsWSep(Iterable strings, String separator) {
    StringBuilder sb = new StringBuilder();
    String sep = "";
    for(String s: strings) {
        sb.append(sep).append(s);
        sep = separator;
    }
    return sb.toString();                           
}



5> Chunliang Ly..:

如果您正在为Android开发,TextUtils.join则由SDK提供.



6> Aleksandar J..:

这是迄今为止我发现的最优雅,最干净的方式:

list.stream().collect(Collectors.joining(delimiter));


IntelliJ给我一个提示,我可以通过将其他答案更改为String.join示例的解决方案来改善事情,其理由如下:“报告流API调用链可以简化。它避免遍历集合时创建多余的临时对象”。

7> andras..:

Guava是来自Google的一个非常简洁的图书馆:

Joiner joiner = Joiner.on(", ");
joiner.join(sList);



8> Manish Mulan..:

我更喜欢Java 8中的String.join(list)



9> sdfx..:

您是否看到过此Coding Horror博客条目?

微观优化剧院的悲剧

我不确定它是否“更整洁”,但是从性能的角度来看,这可能无关紧要。



10> 小智..:

在我看来,StringBuilder将快速有效。

基本形式如下所示:

public static String concatStrings(List strings)
{
    StringBuilder sb = new StringBuilder();
    for(String s: strings)
    {
        sb.append(s);
    }
    return sb.toString();       
}

如果这太简单了(可能是这样),则可以使用类似的方法并添加如下分隔符:

    public static String concatStringsWSep(List strings, 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()方法。

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有