Stream 的使用:

Stream 是 Java 8 基于函数式编程 的核心工具,专门用来高效、优雅地处理集合 / 数组(筛选、排序、转换、聚合、去重等)。

简单理解:把集合 / 数组变成一条 "数据流",流水线式处理,一行代码搞定复杂操作,告别繁琐的 for 循环!

一、Stream 核心三大特性

  1. 流水线式操作:多个操作连在一起,一步到位
  2. 惰性执行 :只有调用最终操作,中间逻辑才会执行
  3. 一次性使用:一个 Stream 只能用一次,用完即废

二、Stream 操作流程(固定套路)

复制代码
数据源 → 中间操作(筛选/排序/转换...可多个) → 最终操作(结果输出)
  • 数据源:集合、数组、文件等
  • 中间操作:返回 Stream,可链式拼接
  • 最终操作:返回结果(集合、数值、对象等),Stream 结束

三、第一步:创建 Stream(数据源)

1. 集合创建(最常用)

java

运行

ini 复制代码
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 串行流
Stream<String> parallelStream = list.parallelStream(); // 并行流

2. 数组创建

java

运行

ini 复制代码
String[] arr = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);

3. 静态方法创建

java

运行

arduino 复制代码
Stream<String> stream = Stream.of("a", "b", "c");

四、第二步:常用中间操作(核心!)

返回 Stream,可链式拼接,重点掌握这 6 个:

1. filter:筛选(条件过滤)

接收 Predicate,保留满足条件的数据

java

运行

ini 复制代码
List<Integer> list = Arrays.asList(1, 5, 8, 12, 15);
// 筛选 > 10 的数字
list.stream().filter(num -> num > 10);

2. map:转换(提取 / 类型转换)

接收 Function,把数据转成另一种形式

java

运行

scss 复制代码
// 字符串 → 长度
list.stream().map(s -> s.length());
// 对象 → 属性(开发最常用)
userList.stream().map(User::getName);

3. sorted:排序

java

运行

scss 复制代码
// 自然排序(升序)
list.stream().sorted();
// 自定义排序(年龄降序)
userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge());

4. distinct:去重

java

运行

scss 复制代码
list.stream().distinct();

5. limit:限制条数

java

运行

scss 复制代码
// 取前 3 条
list.stream().limit(3);

6. skip:跳过条数

java

运行

scss 复制代码
// 跳过前 2 条
list.stream().skip(2);

五、第三步:常用最终操作(必须有!)

返回最终结果,执行后 Stream 关闭:

1. collect:收集结果(最常用)

转成 List/Set/Map

java

运行

ini 复制代码
// 转 List
List<String> resultList = stream.collect(Collectors.toList());
// 转 Map(key=name,value=user)
Map<String, User> userMap = userList.stream()
    .collect(Collectors.toMap(User::getName, u -> u));

2. forEach:遍历

接收 Consumer

java

运行

arduino 复制代码
stream.forEach(System.out::println);

3. count:计数

java

运行

ini 复制代码
long count = stream.count();

4. reduce:聚合(求和 / 最大 / 最小)

接收 BinaryOperator

java

运行

scss 复制代码
// 求和
int sum = list.stream().reduce(0, Integer::sum);
// 最大值
int max = list.stream().reduce(Integer::max).get();

5. anyMatch /allMatch/noneMatch:判断

接收 Predicate

java

运行

ini 复制代码
// 是否有任意一个满足
boolean any = stream.anyMatch(num -> num > 10);
// 是否全部满足
boolean all = stream.allMatch(num -> num > 10);

6. findFirst /findAny:查找

java

运行

ini 复制代码
// 获取第一个
Optional<Integer> first = stream.findFirst();

六、实战:一行代码完成复杂操作(必看)

需求:用户集合 → 筛选成年 → 按年龄降序 → 提取姓名 → 转 List

java

运行

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class User {
    private String name;
    private int age;
    // 构造、getter
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
}

public class StreamTest {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(
            new User("张三", 16),
            new User("李四", 22),
            new User("王五", 19),
            new User("赵六", 25)
        );

        // Stream 一行搞定!
        List<String> adultNameList = userList.stream()
                .filter(u -> u.getAge() >= 18) // 1.筛选成年
                .sorted((u1, u2) -> u2.getAge() - u1.getAge()) // 2.降序
                .map(User::getName) // 3.提取姓名
                .collect(Collectors.toList()); // 4.转List

        System.out.println(adultNameList); // [赵六, 李四, 王五]
    }
}

七、Stream 常用聚合操作(开发必备)

java

运行

scss 复制代码
List<Integer> list = Arrays.asList(1,2,3,4,5);

// 求和
int sum = list.stream().mapToInt(Integer::intValue).sum();
// 最大值
int max = list.stream().mapToInt(Integer::intValue).max().getAsInt();
// 最小值
int min = list.stream().mapToInt(Integer::intValue).min().getAsInt();
// 平均值
double avg = list.stream().mapToInt(Integer::intValue).average().getAsDouble();

八、中间操作 vs 最终操作(快速区分)

表格

类型 返回值 特点 例子
中间操作 Stream 不执行,只拼接 filter、map、sorted
最终操作 具体结果 触发执行,关闭流 collect、forEach、count

口诀 :没有最终操作,Stream 等于白写!

九、核心总结(一句话吃透)

  1. Stream = 集合的流水线工具,专门简化集合操作
  2. 固定流程:创建 → 中间操作(筛选 / 转换 / 排序) → 最终操作(结果)
  3. 核心中间操作:filter(筛选)、map(转换)、sorted(排序)
  4. 核心最终操作:collect(收集)、forEach(遍历)、reduce(聚合)
  5. 优点:代码极简、可读性高、支持并行高效

终极口诀

集合处理不用愁,Stream 流水线解千愁;筛选转换加排序,一行代码全搞定!

相关推荐
企业数字化笔记11 分钟前
视频字幕如何烧录到成片?硬字幕、软字幕、样式控制与播放验收
java·ffmpeg
小朱爱编程12323 分钟前
我用 Jev 做了三个实用工具:整理标签页、分诊飞书反馈、找回 GitHub 收藏
java·开发语言·人工智能·后端·python·架构·ai编程
酷虎软件37 分钟前
视频加标题字幕 API 接口文档
java·数据库·mysql
谢亮_vipxieliang1 小时前
Java 8/11/17/21/25 怎么选?一篇讲清 LTS 升级路线
java·开发语言
Cindy_cd1 小时前
IDEA2021 配置 JDK+Maven
java·开发语言·maven
我要神龙摆尾1 小时前
IDEA 阅读插件
java·ide·intellij-idea·idea-plugs·plugs
涉密IT资质笔记2 小时前
涉密人员脱密期管理规范:期限分级模型、就业限制边界与违规认定标准
java·服务器·前端·网络·数据库
mmsx2 小时前
Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
android·java·dialog·开发语言
u0111026752 小时前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
码上有光2 小时前
Linux:进程间通信——匿名管道通信、命名管道通信
android·java·linux·linux通信·匿名通信·命名通信