You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:42:17