讲师中心 微信公众号
AI工具推荐 视频效率加速

Java面试之JDK 8中Stream流的常见用法

云宇酱_6970

云宇酱_6970

发布时间:2026-03-22 09:43:59

|

814人浏览过

|

来源于php中文网

原创

Java 8 Stream 是一次性数据处理管道,非集合替代品;误用会导致异常,需避免null、副作用,合理使用collect和groupingBy。

java面试之jdk 8中stream流的常见用法

Java 8 的 Stream 不是集合,也不能替代集合;它是一次性、不可重用的数据处理管道,用错场景或误用终端操作会导致 IllegalStateException 或空指针。

Stream 创建时别直接用 null 集合调 stream()

常见错误:从 DAO 层拿到可能为 null 的 List,直接链式调用 .stream().filter(...),结果抛 NullPointerException。

  • 安全写法:先判空,或用 Optional.ofNullable(list).orElse(Collections.emptyList()).stream()
  • 更简洁:用 Objects.requireNonNullElse(list, Collections.emptyList()).stream()(JDK 9+);JDK 8 就老实用三元运算符
  • 注意 Arrays.asList(null) 会创建含一个 null 元素的列表,不是空流 —— 这和 Stream.of(null) 效果一致,但和 Stream.empty() 完全不同

filter() 和 map() 中别做有副作用的操作

Stream 设计原则是无状态、无副作用;在 filter 里改外部变量、打印日志、发 HTTP 请求,看似能跑通,但并行流(parallelStream())下行为不可预测,且违反函数式语义。

  • 正确做法:过滤逻辑只返回 boolean,转换逻辑只返回新对象;副作用移出 Stream 链,在 forEach 或收集后处理
  • 例如:不要写 list.stream().filter(x -> { log.info(x); return x > 5; }),应拆成 list.stream().filter(x -> x > 5).peek(x -> log.info(x))(peek 是专为调试设计的“合法副作用”入口)
  • peek() 不是终端操作,必须接 collect() 或 forEach() 才会触发

收集结果时小心 Collectors.toList() 和 Collectors.toSet() 的陷阱

toList() 返回的是不可变视图(JDK 16+ 是 ImmutableCollections.ListN),但 JDK 8 实际返回的是 ArrayList —— 可修改;而 toSet() 不保证顺序,且元素必须正确实现 hashCode()/equals()。

立即学习“Java免费学习笔记(深入)”;

  • 需要线程安全可变列表?用 Collectors.toCollection(ArrayList::new)
  • 要保持插入顺序的去重?别用 toSet(),改用 collect(Collectors.collectingAndThen(Collectors.toCollection(LinkedHashSet::new), LinkedHashSet::new)),或更直白:先 distinct() 再 collect(toList())
  • Collectors.groupingBy(keyMapper) 默认用 HashMap,如果 key 是枚举或需有序,显式传 TreeMap::new 作为下游 map factory
Map<String, List<Person>> grouped = people.stream()
    .collect(Collectors.groupingBy(
        Person::getDepartment,
        TreeMap::new,
        Collectors.toList()
    ));

Stream 的真正难点不在语法,而在思维切换:它不关心“怎么循环”,只声明“要什么结果”。一旦开始在 lambda 里写 for 或缓存中间状态,就说明该停下来重想数据流了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2090

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

143

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

529

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5824

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2464

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1632

2025.10.17

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1632

2025.10.17

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn