使用Stream获取奇偶数字列表的问题排查
问题排查与修复
核心问题分析
你的代码存在三个关键问题:
- 打印格式不符合预期:直接用
forEach逐个打印元素,输出的是空格分隔的字符串,而非[2,4]格式 - Stream一次性消费特性未重视:
collect操作已经消耗了原流s,后续对s的操作在严格场景下会抛出IllegalStateException,且调用s.toString()得到的是Stream对象的哈希码,并非元素内容 - 未完成奇偶列表的完整创建:代码仅处理了偶数,没有生成对应的奇数列表
修复后的代码
import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamDemo { public static void main(String[] args) { // 初始化源数据 Integer[] nums = {1, 2, 3, 4}; // 创建偶数列表并按[2,4]格式打印 List<Integer> evenList = Stream.of(nums) .filter(p -> p % 2 == 0) .collect(Collectors.toList()); System.out.println(evenList); // 创建奇数列表 List<Integer> oddList = Stream.of(nums) .filter(p -> p % 2 != 0) .collect(Collectors.toList()); // 可选:打印奇数列表 System.out.println(oddList); } }
关键修复点说明
- 利用列表默认打印格式:将流收集为
List后直接打印,Java会自动输出[元素1, 元素2]的格式,无需手动拼接 - 规避Stream重复消费:Stream一旦被
collect/forEach等终端操作消费就无法复用,因此处理奇数时基于原始数组重新创建流,或者可以用Supplier<Stream<Integer>>包装流实现复用 - 明确奇偶列表的生成:分别过滤生成偶数、奇数两个列表,满足你创建奇偶数字列表的需求
原代码的额外问题解释
你原代码中System.out.println(s.toString());打印出java.util.stream.ReferencePipeline$Head@682a0b20,这是因为Stream对象的默认toString方法返回的是类名+实例哈希码,并非流内的元素内容,属于Java对象的默认行为。
内容的提问来源于stack exchange,提问作者NotAGoodCoder
相关产品推荐
相关产品推荐

