Answers:
x
集合在哪里:
Foo[] foos = x.toArray(new Foo[x.size()]);
x.toArray(new Foo[0])
--- 文档:没有时间阅读...
(new Foo[0])
。根据Collection.toArray文档,`@param是此集合的元素要存储到的数组(如果足够大的话),这意味着它将直接将它们存储在该新数组中。如果给它一个大小为0的数组,它将创建一个新数组,这意味着您有一个较小的数组和一个较大的数组(如果不需要)。
toArray
创建正确类型的目标数组的提示。老实说,在这种情况下,我不会在我的应用程序中关心一个额外的单个空数组。那远远低于噪音水平。
new Foo[0]
更简单的“但不是最好的(内存)”的原因。也就是说,我的意思是我的解决方案更简单但不是最好的(这就是我使用的原因:
)。
new Foo[0]
卡洛斯提出的变体不会遇到这个问题。
使用Java 8更新问题的替代解决方案:
Bar[] result = foos.stream()
.map(x -> new Bar(x))
.toArray(size -> new Bar[size]);
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
如果您多次使用它或循环使用它,则可以定义一个常量
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[]{});
const
不是Java!public static final Foo[] FOO = {}
import static
它们来获取它们。
与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])
。
注意:-仅当将API用于带有值的代码时,才应指导API使用以及向后不兼容,null
例如,toArray(null)
因为这些调用由于存在toArray(T[] a)
而将变得模棱两可,并且无法编译。
如果在项目中使用番石榴,则可以使用Iterables::toArray
。
Foo[] foos = Iterables.toArray(x, Foo.class);
对于原始内容,请参见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);
}
这是针对此情况的最终解决方案,位于“更新”部分(借助Google收藏夹):
Collections2.transform (fooCollection, new Function<Foo, Bar>() {
public Bar apply (Foo foo) {
return new Bar (foo);
}
}).toArray (new Bar[fooCollection.size()]);
但是,在doublep的答案中提到了这里的关键方法(我忘记了toArray
方法)。
new Bar[0]
避免了这个问题。
例如,您具有元素为Student类的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
Stream.toArray
JDK中现有的API 匹配。