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() 方法将其转换为流。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库