假设我们有Collection<Foo>
。什么是最好的(当前上下文中LoC最短)将其转换为Foo[]
的方法?允许使用任何众所周知的库。
UPD :(本节还有一个案例;如果您认为为其创建另一个线程,请留下评论):将Collection<Foo>
转换为Bar[]
,其中Bar
具有构造函数使用1个Foo
类型的参数,即public Bar(Foo foo){ ... }
?
答案 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