个人主页:一条泥憨鱼(欢迎各位大佬莅临)精选专栏:数据结构与算法JavaSE ,苍穹外卖日记前言为了让集合操作变得更简洁更优雅更像“操作数据流水线”在 Java 8 之后Java 增加了一个非常重要的特性Stream 流很多同学第一次看到 Stream 时都会觉得list.stream()好抽象。其实本质上Stream 就是一种“处理数据”的方式。类似筛选数据 排序数据 统计数据 加工数据一、为什么要学习 Stream假设我们要找出集合中所有年龄大于 18 的人。传统写法ArrayListInteger list new ArrayList(); list.add(10); list.add(20); list.add(30); ArrayListInteger result new ArrayList(); for(Integer age : list){ if(age 18){ result.add(age); } } System.out.println(result);虽然能实现。但是代码繁琐逻辑不够清晰需要手动循环Stream 写法list.stream() .filter(age - age 18) .forEach(System.out::println);是不是一下子简洁很多哈哈这就是 Stream 的魅力。二、什么是 StreamStream 翻译流我们可以理解为数据在“流水线”中进行加工处理。如原始数据 ↓ 过滤 ↓ 排序 ↓ 去重 ↓ 输出结果三、Stream 的特点特点说明不存储数据只是处理数据不改变原集合原集合不会变支持链式操作写法简洁函数式编程Lambda 表达式四、创建 Stream 流1. List 创建 StreamListString list new ArrayList(); StreamString stream list.stream();2. Set 创建 StreamSetString set new HashSet(); StreamString stream set.stream();3. Map 创建 StreamMap 不能直接 stream需要map.keySet().stream() map.values().stream() map.entrySet().stream()示例MapInteger,String map new HashMap(); map.put(1,Java); map.put(2,Python); map.entrySet().stream() .forEach(System.out::println);4. 数组创建 StreamArrays.stream(arr)示例int[] arr {1,2,3}; Arrays.stream(arr) .forEach(System.out::println);五、Stream 常用方法Stream 操作分两类类型说明中间操作返回新的 Stream终结操作结束 Stream六、中间操作1. filter() 过滤作用筛选数据示例过滤偶数import java.util.Arrays; public class Demo { public static void main(String[] args) { Arrays.asList(1,2,3,4,5,6) .stream() .filter(n - n % 2 0) .forEach(System.out::println); } }输出2 4 62. map() 加工数据作用转换数据示例数字平方import java.util.Arrays; public class Demo { public static void main(String[] args) { Arrays.asList(1,2,3) .stream() .map(n - n * n) .forEach(System.out::println); } }输出1 4 93. sorted() 排序示例Arrays.asList(5,1,3,2) .stream() .sorted() .forEach(System.out::println);输出1 2 3 5降序排序.sorted((a,b) - b - a)4. distinct() 去重示例Arrays.asList(1,1,2,2,3,3) .stream() .distinct() .forEach(System.out::println);输出1 2 35. limit() 获取前几个示例Arrays.asList(1,2,3,4,5) .stream() .limit(3) .forEach(System.out::println);输出1 2 36. skip() 跳过元素示例Arrays.asList(1,2,3,4,5) .stream() .skip(2) .forEach(System.out::println);输出3 4 5七、终结操作1. forEach() 遍历stream.forEach(System.out::println);2. count() 统计数量示例long count Arrays.asList(1,2,3,4) .stream() .count(); System.out.println(count);输出43. collect() 收集结果最重要的方法之一。示例收集为 Listimport java.util.List; import java.util.stream.Collectors; public class Demo { public static void main(String[] args) { ListInteger list Arrays.asList(1,2,3,4,5) .stream() .filter(n - n % 2 0) .collect(Collectors.toList()); System.out.println(list); } }输出[2, 4]八、Stream 完整案例案例处理学生成绩需求找出大于80分的成绩 按降序排序 取前3名代码import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Demo { public static void main(String[] args) { ListInteger scores Arrays.asList(90,75,88,60,95,85); ListInteger result scores.stream() .filter(s - s 80) .sorted((a,b) - b - a) .limit(3) .collect(Collectors.toList()); System.out.println(result); } }输出[95, 90, 88]九、Stream 与传统循环对比对比for循环Stream写法繁琐简洁可读性一般高链式操作不支持支持函数式编程不支持支持十、注意事项1. Stream 只能使用一次错误用法StreamString stream list.stream(); stream.forEach(System.out::println); stream.forEach(System.out::println);会报错因为流已经关闭。2. Stream 不会修改原数据list.stream().sorted();不会改变原集合。十一、小tips1. Stream 是什么一种操作数据的流水线。2. Stream 有什么优点代码简洁支持链式编程函数式风格3. 中间操作和终结操作区别类型特点中间操作返回 Stream终结操作返回结果并结束流十二、常用方法总结方法作用filter过滤map转换sorted排序distinct去重limit截取skip跳过forEach遍历count统计collect收集十三、一张图理解 Stream集合数据 ↓ stream() ↓ filter() ↓ map() ↓ sorted() ↓ collect() ↓ 结果集合十四、小结Stream 核心思想“像流水线一样处理数据”Stream 最核心优势代码更简洁 逻辑更清晰 支持函数式编程Stream 流本质上就是 Java 用来“优雅处理集合数据”的工具。