在使用 Stream 的过程中,还是有不少场景需要将流内的元素转成数组。Stream 提供了两个方法给我们将之转为数组。
- toArray()
 - toArray(IntFunction<A[]> generator)
 
toArray(IntFunction<A[]> generator)
方法定义
<A> A[] toArray(IntFunction<A[]> generator)
方法传入一个 IntFunction,返回一个数组。Function 我们前面讲过,输入一个参数,输出一个参数。由于是 IntFunction<A[]>,入参的类型限制为 int,表示的含义是 流内元素的数量;返回结果是一个数组,这个数组承载的内容就是流内元素的内容。
使用举例
正常使用
1  | public void toArrayWithFuncNormalTest() {  | 
不出所料,程序正常输出 this is toArrayWithFuncTest。在这里,我们提供的 IntFunction<A[]> 正确利用了流内元素的类型,也正确利用了流内元素的数量。
IntFunction 强行改变数组大小会怎样
1  | public void toArrayWithFuncWrongSizeTest() {  | 
程序运行异常,看来手动改返回的数组大小是无用的。
java.lang.IllegalStateException: Begin size 3 is not equal to fixed size 2
IntFunction 强行改变数组类型会怎样
1  | public void toArrayWithFuncWrongTypeTest() {  | 
程序同样运行异常,看来传入的类型和 Stream 元素的类型不一致也不行。
java.lang.ArrayStoreException: java.lang.String
toArray()
方法定义
Object[] toArray()
这个方法使用起来就比较简单了,不用传任何参数,返回一个 Object[] 数组。其实看下实现就明白了。
1  | public final Object[] toArray() {  | 
直接调用了 toArray(IntFunction<A[]> generator),所以使用上应该不用多说了吧。
使用举例
1  | public void toArrayTest() {  | 
程序正确输出:this is toArrayTest。
总结
- toArray(IntFunction<A[]> generator) 传入的 
IntFunction的主要目的是让我们提供返回的数组类型。 - 不要试图去改变 
IntFunction返回数组的大小和类型,当你改的时候,就是程序异常的时候。 - toArray() 返回的类型是 
Object[],但是你可以在遍历时强转类型达到目的。