我想加入一个字符串[]与胶水字符串。有这个函数吗?


当前回答

如果你正在寻找在android中使用什么,它是:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

例如:

String joined = TextUtils.join(";", MyStringArray);

其他回答

类似的替代方案

/**
 * @param delimiter 
 * @param inStr
 * @return String
 */
public static String join(String delimiter, String... inStr)
{
    StringBuilder sb = new StringBuilder();
    if (inStr.length > 0)
    {
        sb.append(inStr[0]);
        for (int i = 1; i < inStr.length; i++)
        {
            sb.append(delimiter);                   
            sb.append(inStr[i]);
        }
    }
    return sb.toString();
}

从Java8开始,可以使用String.join()。

String.join(", ", new String[]{"Hello", "World", "!"})

生成:

Hello, World, !

另外,Apache Commons Lang有一个StringUtils类,它有一个连接函数,可以将数组连接在一起形成一个String。

例如:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

生成以下字符串:

Hello, World, !

无论选择哪种方法,都要注意数组中的空值。它们的字符串表示形式是“null”,所以如果不是你想要的行为,跳过null元素。

String[] parts = {"Hello", "World", null, "!"};
Stream.of(parts)
      .filter(Objects::nonNull)
      .collect(Collectors.joining(" "));

如果你正在使用函数式Java库,并且由于某种原因不能使用Java 8中的流(当使用Android + Retrolambda插件时可能会出现这种情况),这里有一个函数式解决方案:

String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                    ""
            );
}

注意,这不是最有效的方法,但它确实适用于小列表。

如前所述,从Java 8开始,类StringJoiner也是一个可用的选项:

@NotNull
String stringArrayToCsv(@NotNull String[] data) {
    if (data.length == 0) {return "";}
    StringJoiner joiner = new StringJoiner(", ");
    Iterator<String> itr = Arrays.stream(data).iterator();
    while (itr.hasNext()) {joiner.add(itr.next());}
    return joiner.toString();
}

然而,传统的String.join()的导入和代码更少:

@NotNull
String stringArrayToCsv(@NotNull String[] data) {
    if (data.length == 0) {return "";}
    return String.join(", ", data);
}