一、Stream 流简介

JDK8 新特性,用于简化集合 / 数组的数据处理,通过链式调用完成筛选、转换、统计等操作,代码简洁易读。 整体流程:获取流 → 中间操作(可链式) → 终结操作(关闭流)

二、4 种获取 Stream 流对象的方式

    1.单列集合(List/Set) 
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
    2..数组
int[] arr = {1,2,3};
IntStream stream = Arrays.stream(arr);
    3.多零散数据
Stream<String> stream = Stream.of("a","b","c");

    4.双列集合 Map

  • 获取键流:map.keySet().stream()
  • 获取值流:map.values().stream()
  • 获取键值对流:map.entrySet().stream()

三、Stream 中间操作(返回新流,可链式调用)

方法 作用
filter(Predicate) 过滤,保留满足条件元素
limit(long n) 截取前 n 个元素
skip(long n) 跳过前 n 个元素
distinct() 去重(依赖 hashCode+equals)
map(Function) 类型转换 / 元素加工
concat(a,b) 静态方法,合并两个流
//筛选以"张"开头、长度为3的字符串
list.stream()
    .filter(s -> s.startsWith("张"))
    .filter(s -> s.length() == 3)
    .forEach(System.out::println);

四、Stream 终结操作(关闭流,无法继续链式)

执行后流失效,必须作为链式最后一步

  1. forEach(Consumer):遍历所有元素
  2. count():返回流中元素总个数(long 类型)

五、收集操作 collect ()

将流处理后的结果转回集合,核心工具类Collectors

  1. 转 List:Collectors.toList()
  2. 转 Set:Collectors.toSet()
  3. 转 Map:Collectors.toMap(键映射,值映射)
//过滤偶数,收集为新List
List<Integer> newList = list.stream()
        .filter(num -> num % 2 == 0)
        .collect(Collectors.toList());

六、完整综合案例

需求:筛选名字以 "张" 开头、长度 3 的姓名,存入新集合

List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三丰");
list.add("张无忌");
list.add("李四");

List<String> res = list.stream()
        .filter(s -> s.startsWith("张"))
        .filter(s -> s.length() == 3)
        .collect(Collectors.toList());

res.forEach(System.out::println);

七、核心注意事项 ⚠️

  1. 流只能使用一次:执行终结操作后流关闭,重复调用会报错
  2. 中间操作延迟加载,无终结操作时代码不会执行
  3. concat 是静态方法,直接Stream.concat(流1,流2)调用
  4. distinct 去重依赖实体类重写hashCode()equals()
  5. 基本类型数组流有专用流:IntStream/LongStream/DoubleStream

八、开发选型总结

  • 简单遍历:普通 for 循环
  • 复杂筛选、转换、多步处理:优先 Stream 流,代码极简
  • 需要保存处理后数据:搭配collect()收集到集合
  • 大数据量复杂计算:并行流stream.parallelStream()提升效率
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐