java list=null,可以stream吗

不可以直接对 null列表进行 Stream 操作 ,会抛出 NullPointerException

解决方案:

1. 使用 Optional 包装(推荐)

复制代码
List<String> list = null;
List<String> result = Optional.ofNullable(list)
    .orElse(Collections.emptyList())
    .stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

2. 使用 Collections.emptyList() 替代 null

复制代码
List<String> list = null;
List<String> result = (list == null ? Collections.emptyList() : list)
    .stream()
    .filter(Objects::nonNull)
    .collect(Collectors.toList());

3. Java 9+ 的 Stream.ofNullable(单个元素)

复制代码
// 注意:这是针对单个元素,不是整个列表
Stream<String> stream = Stream.ofNullable(list)
    .flatMap(List::stream);

4. 自定义工具方法

复制代码
public static <T> Stream<T> safeStream(List<T> list) {
    return list == null ? Stream.empty() : list.stream();
}

// 使用
List<String> result = safeStream(list)
    .map(String::toLowerCase)
    .collect(Collectors.toList());

5. 使用第三方库

复制代码
// Apache Commons Collections
List<String> result = CollectionUtils.emptyIfNull(list)
    .stream()
    .collect(Collectors.toList());

最佳实践建议:

  1. 避免返回 null 列表,尽量返回空集合:

    // 推荐
    public List<String> getList() {
    return Collections.emptyList(); // 不是 null
    }

    // 不推荐
    public List<String> getList() {
    return null;
    }

  2. 使用 @NonNull 注解(如 Lombok 或 javax.annotation)

  3. 在方法内部处理空值,确保调用方不需要处理 null

示例:安全处理

复制代码
List<String> processList(List<String> input) {
    return Optional.ofNullable(input)
        .orElseGet(Collections::emptyList)
        .stream()
        .filter(Objects::nonNull)
        .map(String::trim)
        .filter(s -> !s.isEmpty())
        .collect(Collectors.toList());
}

核心原则 :在调用 stream()之前,确保列表不为 null。

相关推荐
铁皮哥2 分钟前
【后端/Agent 开发】给你的项目配置一套 .claude/ 工作流:别再裸用 Claude Code 了!
java·windows·python·spring·github·maven·生活
乐之者v8 分钟前
AI编程 -- codex添加代码,在intellij Idea中没有显示,如何处理?
java·ide·intellij-idea
2401_878820471 小时前
Sa-Token基础篇
java·spring boot·后端·sa-token
2301_816374331 小时前
Nginx下构建PC站点
java·运维·nginx
无所事事O_o1 小时前
JAVA应用不定时卡顿问题排查过程记录
java·优化
幸福巡礼1 小时前
【LangChain 1.2 实战(八)】Agent Middleware 实战 —— 动态路由、监控、安全与容错
java·安全·langchain
Byron__2 小时前
Java JVM核心知识点复习笔记
java·jvm·笔记
程序员小白条2 小时前
别盲目卷算法!2026 程序员\&大学生,最稳的 AI 技术进阶路线全梳理
java·网络·人工智能·网络协议·http·面试
启山智软2 小时前
【 商城系统源码:Java与PHP的区别】
java·开发语言·php
练习时长两年半的程序员小胡2 小时前
Java程序员转大模型应用开发专题(一):核心基础概念
java·开发语言·transformer·自注意力