3

我有一组Ingredient对象,我想获取它们的所有名称(通过getName())并将它们加入逗号分隔的字符串中。目前我的代码如下所示:

public static String getIngredientList(Collection<Ingredient> ingredients) {
    final Iterator<Ingredient> iterator = ingredients.iterator();
    final String[] names = new String[ingredients.size()];

    for (int i = 0; iterator.hasNext(); i++) {
        names[i] = iterator.next().getName();
    }

    return TextUtils.join(", ", names);
}

我想知道是否有更简洁的方法将所有名称收集到一个String[]对象中。如果这是 Ruby,例如,很容易拉出一个简短的单行来完全满足我的需要:

ingredients.map(&:name).join(', ')
4

3 回答 3

3

使用Eclipse Collections,您可以使用 JDK 5 - 7 编写以下代码:

MutableList<Ingredient> ingredients =
        Lists.mutable.with(
                new Ingredient("Flour"),
                new Ingredient("Sugar"),
                new Ingredient("Eggs"),
                new Ingredient("Milk"));
MutableList<String> ingredientNames = ingredients.collect(new Function<Ingredient, String>()
{
    public String valueOf(Ingredient ingredient)
    {
        return ingredient.getName();
    }
});
String delimitedNames = ingredientNames.makeString(", ");
Assert.assertEquals("Flour, Sugar, Eggs, Milk", delimitedNames);

使用支持 lambda 和方法引用的 Java 8,您可以将其压缩为以下内容:

MutableList<Ingredient> ingredients =
        Lists.mutable.with(
                new Ingredient("Flour"),
                new Ingredient("Sugar"),
                new Ingredient("Eggs"),
                new Ingredient("Milk"));
String delimitedNames =
        ingredients.collect(Ingredient::getName).makeString(", ");
Assert.assertEquals("Flour, Sugar, Eggs, Milk", delimitedNames);

在本例中,使用不带参数的重载形式 makeString() 将产生相同的字符串,因为 makeString() 调用 makeString(“, “)。

String delimitedNames =
        ingredients.collect(Ingredient::getName).makeString();
Assert.assertEquals("Flour, Sugar, Eggs, Milk", delimitedNames);

注意:我是 Eclipse Collections 的提交者。

于 2013-05-16T15:08:05.670 回答
0
StringBuilder result = new StringBuilder();
for(String string : collectionOfStrings) {
    result.append(string);
    result.append(",");
}
return result.length() > 0 ? result.substring(0, result.length() - 1): "";

请参阅重复的帖子: 从集合/数组/列表创建逗号分隔字符串的最复杂方法?

于 2013-05-13T13:30:00.130 回答
0

你为什么不首先使用a StringBuilder?代码的相关部分:

StringBuilder b = new StringBuilder();
for(Ingredient ingredient: ingredients) {
    b.append(ingredient.getName() + ", ");
}
return b.toString();

当然,您必须删除最后一个附加的“,”,这可以通过使用该substring方法或不附加最后一个来完成。

于 2013-05-13T13:28:06.650 回答