将集合转换为数组最简单的方法?

假设我们有一个Collection<Foo> 。 什么是最好的(在当前的情况下最短的LoC)的方式来将其转换为Foo[] ? 任何知名的图书馆都是允许的。

UPD:(在本节中还有一个例子;如果你觉得值得为它创build另一个线程,请留下评论):如何将Collection<Foo>转换为Bar[] ,其中Bar具有1个参数types为Foo构造函数ie public Bar(Foo foo){ ... }

其中x是集合:

 Foo[] foos = x.toArray(new Foo[x.size()]); 

使用Java 8的更新问题的替代解决scheme:

 Bar[] result = foos.stream() .map(x -> new Bar(x)) .toArray(size -> new Bar[size]); 

如果多次使用或循环使用,可以定义一个常量

 public static final Foo[] FOO = new Foo[]{}; 

并做这样的转换

 Foo[] foos = fooCollection.toArray(FOO); 

toArray方法将使用空数组来确定目标数组的正确types并为您创build一个新数组。


这是我的更新build议:

 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[]{}); 

以下是更新部分的案例的最终解决scheme(在Googlecollections集的帮助下):

 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); }