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

时间:2010-07-20 20:10:17

标签: java arrays collections transformation

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

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

8 个答案:

答案 0 :(得分:236)

x是集合的地方:

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

答案 1 :(得分:32)

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

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

答案 2 :(得分:10)

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

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

答案 3 :(得分:3)

以下是更新部分案例的最终解决方案(在Google Collections的帮助下):

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

但是,the doublep's answer中提到了关键方法(我忘记了toArray方法)。

答案 4 :(得分:3)

对于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 on the mailing list (重点是我的解释)所述,其性能应与现有的 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一起用于代码时,API的使用应与向后不兼容一起进行指导值,例如 toArray(null) ,因为这些调用现在由于存在toArray(T[] a)而变得模棱两可,并且无法编译。

答案 5 :(得分:2)

原文见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);
}    

答案 6 :(得分:0)

例如,您有一个带有学生类元素的ArrayList集合:

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

答案 7 :(得分:0)

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

modify_url