在使用 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[]
,但是你可以在遍历时强转类型达到目的。