Stream API对数组进行操作。
import java.util.Arrays;
import java.util.stream.Stream;
/**
* 主程序类,演示了如何使用Stream API对数组进行操作。
*/
public class App {
/**
* 主方法,展示了不同方式将数组转换为Stream并进行过滤操作。
*
* @param args 命令行参数(未使用)
*/
public static void main(String[] args) {
// 示例1:对整型数组使用Arrays.stream进行流转换,然后过滤出偶数并打印
int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Arrays.stream(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
// 示例2:使用Stream.of方法创建流,对整型数组进行过滤操作并打印
Stream.of(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
// 示例3:将整型数组转换为List,然后通过stream方法创建流,过滤出偶数并打印
Arrays.asList(arr).stream().filter(i -> i % 2 == 0).forEach(System.out::println);
// 示例4:对整型对象数组使用Arrays.stream进行流转换,过滤出偶数并打印
Integer[] brr = new Integer[] { 9, 2, 8, 1, 5, 1 };
Arrays.stream(brr).filter(i -> i % 2 == 0).forEach(System.out::println);
// 示例5:使用Stream.of方法创建流,对整型对象数组进行过滤操作并打印
Stream.of(brr).filter(i -> i % 2 == 0).forEach(System.out::println);
// 示例6:将整型对象数组转换为List,然后通过stream方法创建流,过滤出偶数并打印
Arrays.asList(brr).stream().filter(i -> i % 2 == 0).forEach(System.out::println);
}
}
运行上述代码,程序无法通过编译阶段,Operator '%' cannot be applied to 'int[]', 'int'
这个错误是由于在示例2和示例3中,尝试将一个整型数组作为整体传递给 filter 方法,而该方法期望的是一个单独的整型值,而不是整型数组。
示例2中:Stream.of(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
Stream.of(arr) 创建了一个流,但是 filter 方法期望对流中的每个元素进行操作,而不是整个数组。因此,需要对数组中的每个元素进行操作,可以通过使用 map 方法将每个整型数组元素映射为流中的单个元素:
Stream.of(arr).flatMapToInt(Arrays::stream).filter(i -> i % 2 == 0).forEach(System.out::println);
示例3中:Arrays.asList(arr).stream().filter(i -> i % 2 == 0).forEach(System.out::println);
Arrays.asList(arr) 创建了一个包含整型数组的列表,但是列表中的元素仍然是整型数组,而不是单个的整型值。因此,在这里也需要将每个整型数组的元素映射为流中的单个元素:
Arrays.stream(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
修改如下
// 示例2:使用Stream.of方法创建流,对整型数组进行过滤操作并打印
// Stream.of(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
Stream.of(arr).flatMapToInt(Arrays::stream).filter(i -> i % 2 == 0).forEach(System.out::println);
// 示例3:将整型数组转换为List,然后通过stream方法创建流,过滤出偶数并打印
// Arrays.asList(arr).stream().filter(i -> i % 2 ==
// 0).forEach(System.out::println);
Arrays.stream(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
示例4.5可以执行,但是示例2.3不行,为什么?
示例4和示例5可以执行,而示例2和示例3不能执行的原因是因为在 Java 中,Stream API 在处理基本数据类型数组和对象数组时有所区别。
示例4和示例5中,整型对象数组 Integer[] brr 的元素类型是 Integer,而不是基本数据类型 int。因此,Arrays.stream(brr) 和 Stream.of(brr) 可以直接创建流,并对数组中的元素进行操作。
但是,在示例2和示例3中,arr 是一个基本数据类型 int 的数组,而 Stream.of(arr) 和 Arrays.asList(arr) 方法无法直接创建流,因为它们无法识别基本数据类型的数组。在这种情况下,你需要手动转换基本数据类型数组为流的元素,可以使用 Arrays.stream(arr) 方法来创建流,然后进行操作。
综上所述,示例4和示例5中的数组类型是对象数组,因此可以直接使用 Stream.of() 创建流,而示例2和示例3中的数组类型是基本数据类型数组,需要使用 Arrays.stream() 方法将其转换为流。
浙公网安备 33010602011771号