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

假设我们有一个 Collection<Foo>。将其转换为 Foo[]的最佳方法是什么(在当前上下文中是 LoC 中的最短方法) ?允许使用任何 众所周知库。

UPD: (本节中还有一个例子; 如果您认为值得为它创建另一个线程,请留下注释) : 如何将 Collection<Foo>转换为 Bar[],其中 Bar具有具有 Foo类型的1个参数的构造函数,即 public Bar(Foo foo){ ... }

200873 次浏览

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

原文见 双倍答案:

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

下面是更新部分中的最终解决方案(借助 Google Collection) :

Collections2.transform (fooCollection, new Function<Foo, Bar>() {
public Bar apply (Foo foo) {
return new Bar (foo);
}
}).toArray (new Bar[fooCollection.size()]);

但是,这里的关键方法在 替身的答案中提到过(我忘了 toArray方法)。

使用 Java8解决更新后问题的替代方案:

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

对于 JDK/11,将 Collection<Foo>转换为 Foo[]的另一种方法是使用 Collection.toArray(IntFunction<T[]> generator) ,如下所示:

Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11

正如 在邮件列表中的@Stuart(重点是我的)所解释的那样,这种方法的性能基本上应该与现有的 Collection.toArray(new T[0])——相同

结果是,使用 Arrays.copyOf(的实现是 最快,可能是因为 这是内在的

它可以避免对新分配的数组进行零填充,因为它知道 整个数组内容将被覆盖 公共 API 看起来像。

JDK 中 API 的实现如下:

default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}

默认实现调用 generator.apply(0)以获取零长度数组 然后简单地调用 toArray(T[]),这通过 Arrays.copyOf() 快速路径,所以它基本上是相同的速度作为 toArray(new T[0])


注意 :-只是当使用具有 null值的代码(例如 toArray(null))时,API 的使用应该与 向后不相容性向后不相容性一起指导,因为这些调用现在由于现有的 toArray(T[] a)而变得模糊不清,并且将无法编译。

例如,您拥有带有元素的 ArrayList 集合 Student class:

List stuList = new ArrayList();
Student s1 = new Student("Raju");
Student s2 = new Student("Harish");
stuList.add(s1);
stuList.add(s2);
//now you can convert this collection stuList to Array like this
Object[] stuArr = stuList.toArray();           // <----- toArray() function will convert collection to array

如果在项目中使用番石榴,则可以使用 Iterables::toArray

Foo[] foos = Iterables.toArray(x, Foo.class);

实际上在现代 Java 中,不设置显式大小的版本更快:

. toArray (new MyClass [0])或. toArray (new MyClass [ myList.size ()]) ?

这是由独立研究和 IntelliJ 团队支持的。

也就是说,这是目前最快的方法:

Foo[] foos = x.toArray(new Foo[0])

或者,更好的是,有一点安全感:

Foo[] foos = x == null ? null : x.toArray(new Foo[0])

Foo [] fos = x.toArray (new Foo [0]) ;