2013-05-13 3 views
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[] объекта. Если бы это было рубин, например, было бы легко снять короткий Однострочник сделать именно то, что мне нужно:

ingredients.map(&:name).join(', ') 
+0

@ 323go возможно Ингредиенты будут иметь больше, чем поле – Blackbelt

+0

дубликат http://stackoverflow.com/questions/205555/the-most-sophisticated-way-for-creating-comma-separated-strings-from-a-collectio – MrSimpleMind

+0

Это было бы сложным и не очень хорошим способом, но вы можете реализовать toString из 'Ingredient', который будет возвращать только значение имени. И тогда вы можете просто использовать 'TextUtils.join (", ", components.toArray())' –

ответ

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 с поддержкой лямбдах и ссылки на методы, вы можете сжать его до:

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.

0

Почему вы не используете StringBuilder в первую очередь? Соответствующая часть кода:

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

Конечно, вы должны удалить последний «» добавляется, что можно сделать с помощью метода substring или не прилагая последнюю.

Смежные вопросы