我们知道,原始类型在 java 中不是对象,对于它们来说,Arrays 类中有重载的stream()method。假设这里只考虑int。如果我们通过 int[] 然后 stream(int[] array) 被调用并返回 IntStream 对象。
如果你去看IntStream 类,那么你会发现只有一个toArray方法,它不接受任何参数。
所以,我们不能toArray(int[]::new)。
int[] in1 = {0, 0, 2, 0, 3};
int[] in2 = Arrays.stream(in1).filter(x -> x != 0).toArray();
但是对于任何引用类型的数组,我们都可以转换为特定的类型。
例如
String[] str2 = {"a","b",null,"c"};
String[] strArr = Arrays.stream(str2).filter(i -> !=null).toArray(String[]::new);
for (String string : strArr) {
System.out.println(string);
}
在引用类型的情况下,一个泛型的stream 方法从Arrays 类调用并产生Stream<T>,现在Stream 接口有两个重载的toArray()。
如果我们使用
-
toArray() 然后yield Object[],在这种情况下我们需要进行种姓。
-
toArray(IntFunction<A[]> generator) 然后给我们A[],其中A 是任何引用类型。
见下例
package test;
import java.util.Arrays;
public class EliminateZeroFromIntArray {
public static void main(String[] args) {
int[] in1 = {0, 0, 2, 0, 3};
int[] in2 = Arrays.stream(in1).filter(x -> x != 0).toArray();
for (int i : in2) {
System.out.println(i);
}
String[] str = {"a","b",null,"c"};
Object[] array = Arrays.stream(str).filter(i -> i !=null).toArray();
for (Object object : array) {
System.out.println((String)object);
}
String[] str2 = {"a","b",null,"c"};
String[] strArr = Arrays.stream(str2).filter(i -> i !=null).toArray(String[]::new);
for (String string : strArr) {
System.out.println(string);
}
}
}