在Java中构建一串分隔项目的最佳方法是什么?

2022-08-31 04:49:10

在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缺少连接命令,我无法找出任何等效的东西。

那么,在Java中做到这一点的最佳方法是什么?


答案 1

Pre Java 8:

Apache的commons lang是你在这里的朋友 - 它提供了一个与你在Ruby中提到的方法非常相似的连接方法:

StringUtils.join(java.lang.Iterable,char)


Java 8:

Java 8 通过 和 提供开箱即用的连接。下面的代码段显示了如何使用它们:StringJoinerString.join()

StringJoiner

StringJoiner joiner = new StringJoiner(",");
joiner.add("01").add("02").add("03");
String joinedString = joiner.toString(); // "01,02,03"

String.join(CharSequence delimiter, CharSequence... elements))

String joinedString = String.join(" - ", "04", "05", "06"); // "04 - 05 - 06"

String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)

List<String> strings = new LinkedList<>();
strings.add("Java");strings.add("is");
strings.add("cool");
String message = String.join(" ", strings);
//message returned is: "Java is cool"

答案 2

你可以写一个在java.util.Lists上工作的小的连接式实用程序方法。

public static String join(List<String> list, String delim) {

    StringBuilder sb = new StringBuilder();

    String loopDelim = "";

    for(String s : list) {

        sb.append(loopDelim);
        sb.append(s);            

        loopDelim = delim;
    }

    return sb.toString();
}

然后像这样使用它:

    List<String> list = new ArrayList<String>();

    if( condition )        list.add("elementName");
    if( anotherCondition ) list.add("anotherElementName");

    join(list, ",");