当我在一个Java应用程序中工作时,我最近需要组装一个以逗号分隔的值列表,以传递给另一个web服务,而不知道预先会有多少个元素。我能想到的最好的是这样的:

public String appendWithDelimiter( String original, String addition, String delimiter ) {
    if ( original.equals( "" ) ) {
        return addition;
    } else {
        return original + delimiter + addition;
    }
}

String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );

我意识到这不是特别有效,因为到处都在创建字符串,但我追求的是清晰而不是优化。

在Ruby中,我可以这样做,这感觉要优雅得多:

parameterArray = [];
parameterArray << "elementName" if condition;
parameterArray << "anotherElementName" if anotherCondition;
parameterString = parameterArray.join(",");

但是由于Java缺少join命令,我找不到任何等价的命令。

那么,在Java中最好的方法是什么呢?


当前回答

您可能应该使用带有append方法的StringBuilder来构造结果,但除此之外,这是Java所提供的最好的解决方案。

其他回答

您的方法还不错,但是您应该使用StringBuffer而不是使用+号。+有一个很大的缺点,就是为每个操作创建了一个新的String实例。你的弦越长,开销就越大。所以使用StringBuffer应该是最快的方法:

public StringBuffer appendWithDelimiter( StringBuffer original, String addition, String delimiter ) {
        if ( original == null ) {
                StringBuffer buffer = new StringBuffer();
                buffer.append(addition);
                return buffer;
        } else {
                buffer.append(delimiter);
                buffer.append(addition);
                return original;
        }
}

创建完字符串后,只需对返回的StringBuffer调用toString()即可。

如果您的代码不是线程化的,您应该使用StringBuilder,而不是使用字符串连接,如果是线程化的,则应该使用StringBuffer。

使用基于java.lang.StringBuilder的方法!(“一个可变的字符序列。”)

就像你提到的,所有那些字符串连接都在创建字符串。StringBuilder不会这样做。

为什么用StringBuilder代替StringBuffer?从StringBuilder javadoc:

在可能的情况下,建议优先使用这个类而不是StringBuffer,因为在大多数实现中它会更快。

不要使用join, delimiter或StringJoiner方法和类 在Android N和O版本下不工作。否则使用简单的代码逻辑 作为;

 List<String> tags= emp.getTags();
        String tagTxt="";
        for (String s : tags) {
            if (tagTxt.isEmpty()){
                tagTxt=s;
            }else
                tagTxt= tagTxt+", "+s;
        }  

您可以泛化它,但正如您所说,Java中没有连接。

这样可能效果更好。

public static String join(Iterable<? extends CharSequence> s, String delimiter) {
    Iterator<? extends CharSequence> iter = s.iterator();
    if (!iter.hasNext()) return "";
    StringBuilder buffer = new StringBuilder(iter.next());
    while (iter.hasNext()) buffer.append(delimiter).append(iter.next());
    return buffer.toString();
}