0%

stream and lambda(15) - 终止操作之 stream 数组操作 toArray

在使用 Stream 的过程中,还是有不少场景需要将流内的元素转成数组。Stream 提供了两个方法给我们将之转为数组。

  1. toArray()
  2. toArray(IntFunction<A[]> generator)

我就问一句,我能先说第二个吗?

toArray(IntFunction<A[]> generator)

方法定义

<A> A[] toArray(IntFunction<A[]> generator)

方法传入一个 IntFunction,返回一个数组。Function 我们前面讲过,输入一个参数,输出一个参数。由于是 IntFunction<A[]>,入参的类型限制为 int,表示的含义是 流内元素的数量;返回结果是一个数组,这个数组承载的内容就是流内元素的内容。

使用举例

正常使用

1
2
3
4
5
6
7
8
public void toArrayWithFuncNormalTest() {
Stream<String> stringStream = Stream.of("this", "is", "toArrayWithFuncTest");
//String[]::new 等效于 size -> new String[size]
String[] strings = stringStream.toArray(String[]::new);
for (String str : strings) {
System.out.print(str + " ");
}
}

不出所料,程序正常输出 this is toArrayWithFuncTest。在这里,我们提供的 IntFunction<A[]> 正确利用了流内元素的类型,也正确利用了流内元素的数量。

IntFunction 强行改变数组大小会怎样

1
2
3
4
5
6
7
public void toArrayWithFuncWrongSizeTest() {
Stream<String> stringStream = Stream.of("this", "is", "toArrayWithFuncTest");
String[] strings = stringStream.toArray(size -> new String[2]);
for (String str : strings) {
System.out.print(str + " ");
}
}

程序运行异常,看来手动改返回的数组大小是无用的。

java.lang.IllegalStateException: Begin size 3 is not equal to fixed size 2

IntFunction 强行改变数组类型会怎样

1
2
3
4
5
6
7
public void toArrayWithFuncWrongTypeTest() {
Stream<String> stringStream = Stream.of("this", "is", "toArrayWithFuncTest");
Integer[] nums = stringStream.toArray(Integer[]::new);
for (Integer i : nums) {
System.out.print(i + " ");
}
}

程序同样运行异常,看来传入的类型和 Stream 元素的类型不一致也不行。

java.lang.ArrayStoreException: java.lang.String

toArray()

方法定义

Object[] toArray()

这个方法使用起来就比较简单了,不用传任何参数,返回一个 Object[] 数组。其实看下实现就明白了。

1
2
3
public final Object[] toArray() {
return toArray(Object[]::new);
}

直接调用了 toArray(IntFunction<A[]> generator),所以使用上应该不用多说了吧。

使用举例

1
2
3
4
5
6
7
public void toArrayTest() {
Stream<String> stringStream = Stream.of("this", "is", "toArrayTest");
Object[] objects = stringStream.toArray();
for (Object obj : objects) {
System.out.print(obj + " ");
}
}

程序正确输出:this is toArrayTest

总结

  • toArray(IntFunction<A[]> generator) 传入的 IntFunction 的主要目的是让我们提供返回的数组类型。
  • 不要试图去改变 IntFunction 返回数组的大小和类型,当你改的时候,就是程序异常的时候。
  • toArray() 返回的类型是 Object[],但是你可以在遍历时强转类型达到目的。