是否有更简单的方法从对象集合中收集字符串?

时间:2013-05-13 13:23:50

标签: java android collections

我有一组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(', ')

3 个答案:

答案 0 :(得分:3)

使用Eclipse Collections(以前为GS Collections),您可以使用JDK 5 - 7编写以下内容:

MutableList<Ingredient> ingredients =
        FastList.newListWith(
                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);

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

MutableList<Ingredient> ingredients =
        FastList.newListWith(
                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的提交者。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

StringBuilder result = new StringBuilder();
for(String string : collectionOfStrings) {
    result.append(string);
    result.append(",");
}
return result.length() > 0 ? result.substring(0, result.length() - 1): "";

查看重复的帖子: The most sophisticated way for creating comma-separated Strings from a Collection/Array/List?

相关问题