Как мы знаем, примитивные типы не являются объектами в java, для них есть перегруженный stream()
метод в Arrays
классе.Предположим, здесь просто рассмотрим 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);
}
В случае типа Reference общий метод stream
вызывается из класса Arrays
и выдает Stream<T>
, теперь интерфейс Stream
имеет два перегруженных toArray()
.Если мы используем
toArray()
, то получим 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);
}
}
}