将集合转换为数组最简单的方法?
假设我们有一个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); }