Предположим, что у нас есть a Collection<Foo>
. К чему является лучшим (самый короткий в LoC в текущем контексте) способ преобразовать его Foo[]
? Любым известным библиотекам разрешают.
UPD: (еще один случай в этом разделе; оставьте комментарии, если Вы думаете, что стоит для создания другого потока для него): Что относительно преобразования Collection<Foo>
кому: Bar[]
где Bar
имеет конструктора с 1 параметром типа Foo
т.е. public Bar(Foo foo){ ... }
?
Где x
- это коллекция:
Foo[] foos = x.toArray(new Foo[x.size()]);
Если вы используете его более одного раза или в цикле, вы можете определить константу
public static final Foo[] FOO = new Foo[]{};
и выполнить преобразование, как
Foo[] foos = fooCollection.toArray(FOO);
Метод toArray
возьмет пустой массив для определения правильного тип целевого массива и создайте для вас новый массив.
Вот мое предложение по обновлению:
Collection<Foo> foos = new ArrayList<Foo>();
Collection<Bar> temp = new ArrayList<Bar>();
for (Foo foo:foos)
temp.add(new Bar(foo));
Bar[] bars = temp.toArray(new Bar[]{});
Вот окончательное решение для случая в разделе обновлений (с помощью Google Collections):
Collections2.transform (fooCollection, new Function<Foo, Bar>() {
public Bar apply (Foo foo) {
return new Bar (foo);
}
}).toArray (new Bar[fooCollection.size()]);
Но ключевой подход здесь был упомянут в ответ doublep (я забыл для toArray
метод).
Для оригинала смотрите doublep ответ:
Foo[] a = x.toArray(new Foo[x.size()]);
Что касается обновления:
int i = 0;
Bar[] bars = new Bar[fooCollection.size()];
for( Foo foo : fooCollection ) { // where fooCollection is Collection<Foo>
bars[i++] = new Bar(foo);
}