当我在一个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中最好的方法是什么呢?


当前回答

如果你想在对象属性的列表中应用逗号。这是我发现最有用的方法。

这里getName()是一个类的字符串属性,我一直试图添加“,”。

字符串消息= listName.stream()。map(list -> list. getname ()).collect(collections . getname ())加入(","));

其他回答

为什么不编写自己的join()方法呢?它将接受String和分隔符String的参数集合。在方法中遍历集合并在StringBuffer中构建结果。

public static String join(String[] strings, char del)
{
    StringBuffer sb = new StringBuffer();
    int len = strings.length;
    boolean appended = false;
    for (int i = 0; i < len; i++)
    {
        if (appended)
        {
            sb.append(del);
        }
        sb.append(""+strings[i]);
        appended = true;
    }
    return sb.toString();
}

我会使用谷歌集合。有一个很好的Join工具。 http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/base/Join.html

但如果我想自己写,

package util;

import java.util.ArrayList;
import java.util.Iterable;
import java.util.Collections;
import java.util.Iterator;

public class Utils {
    // accept a collection of objects, since all objects have toString()
    public static String join(String delimiter, Iterable<? extends Object> objs) {
        if (objs.isEmpty()) {
            return "";
        }
        Iterator<? extends Object> iter = objs.iterator();
        StringBuilder buffer = new StringBuilder();
        buffer.append(iter.next());
        while (iter.hasNext()) {
            buffer.append(delimiter).append(iter.next());
        }
        return buffer.toString();
    }

    // for convenience
    public static String join(String delimiter, Object... objs) {
        ArrayList<Object> list = new ArrayList<Object>();
        Collections.addAll(list, objs);
        return join(delimiter, list);
    }
}

我认为它更好地用于对象集合,因为现在你不必在加入它们之前将对象转换为字符串。

所以你可能会做一些事情来获得你想要的感觉:

1)扩展List类-并将join方法添加到其中。join方法将简单地完成连接和添加分隔符(可以是join方法的参数)的工作。

2)看起来java7将在Java中添加扩展方法——它允许你将一个特定的方法附加到一个类上:所以你可以编写join方法并将其作为扩展方法添加到List甚至Collection中。

解决方案1可能是目前唯一现实的解决方案,因为Java 7还没有出来:)但它应该工作得很好。

要使用这两种方法,你只需要像往常一样将所有项目添加到列表或集合中,然后调用新的自定义方法来“加入”它们。

你把事情搞得更复杂了。让我们从例子的结尾开始:

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

通过使用StringBuilder而不是String的小变化,这就变成了:

StringBuilder parameterString = new StringBuilder();
if (condition) parameterString.append("elementName").append(",");
if (anotherCondition) parameterString.append("anotherElementName").append(",");
...

当你完成后(我假设你还必须检查一些其他条件),只要确保你用这样的命令删除了后面的逗号:

if (parameterString.length() > 0) 
    parameterString.deleteCharAt(parameterString.length() - 1);

最后,得到你想要的字符串

parameterString.toString();

您还可以替换第二个调用中的“,”,以附加一个可以设置为任何内容的通用分隔符字符串。如果你有一个列表,你知道你需要附加的东西(非有条件的),你可以把这段代码放在一个接受字符串列表的方法中。