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 流水线解千愁;筛选转换加排序,一行代码全搞定!

相关推荐
Qt程序员21 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean21 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
大白菜和MySQL21 小时前
java应用排查高线程
java·python
KobeSacre21 小时前
ReentrantLock源码
java
嵌入式协会202407221 小时前
(已解决)MinIO python 获取预签名出现forbidden、errornetwork等错误
java·开发语言·python
不才不才不不才21 小时前
Spring AI 实战:聊天、提示词、记忆三件套
java·人工智能·spring·ai
一 乐1 天前
家政服务管理系统|基于springboot + vue家政服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·家政服务管理系统
碳基硅坊1 天前
Spring AI:把大模型接进 Spring 应用
java·人工智能·spring ai
黄毛火烧雪下1 天前
Java 核心知识点总结(一)
java·开发语言
技术小结-李爽1 天前
【工具】Maven的下载、安装、使用
java·maven