跟着AI学Java第1天:Java Lambda与Stream试学包

试学包概述

本试学包基于《6-8周Java工程师成长大纲》第一周内容设计,旨在让你体验后续每日学习的"四维结合"模式:

  • 视频输入:观看优质教程,建立直观认知
  • 文档阅读:理解核心概念与原理
  • 编码实战:通过练习内化知识点
  • 图文总结:梳理知识体系,沉淀学习成果

本次试学聚焦Java 8两大核心特性:Lambda表达式与Stream API,这是现代Java开发的基础,也是后续学习Spring生态的前提。

一、视频推荐清单(B站优质免费课程)

1. 尚硅谷《Java8新特性》完整教程

  • 主讲老师:李贺飞
  • 课程特点:从零开始,循序渐进,涵盖Lambda、Stream、Optional、新时间API等全部新特性
  • 时长:约10小时(分集学习,建议先看前4小时)
  • B站链接https://www.bilibili.com/video/BV14W411u7Ly?p=1
  • 推荐理由:机构权威,讲解系统,案例丰富,适合零基础入门

2. 黑马程序员《Java函数式编程全套视频教程》

  • 主讲老师:满一航
  • 课程特点:专攻函数式编程,深度讲解Lambda与Stream应用场景
  • 时长:16小时
  • B站链接https://www.bilibili.com/video/BV1Gh41187uR
  • 推荐理由:实战导向,代码量大,适合动手能力强的学习者

3. 三更草堂《Java8函数式编程从入门到精通》

  • 主讲老师:三更草堂
  • 课程特点:通俗易懂,思路清晰,重点突出核心概念
  • 时长:5小时
  • B站链接https://www.bilibili.com/video/BV1sv411y7m5
  • 推荐理由:UP主视角,更贴近学习者思维,讲解亲和力强

4. 尚硅谷宋红康《Java零基础入门教程》Java8新特性部分

学习建议

  • 先观看尚硅谷李贺飞老师课程前2小时,建立整体认知
  • 结合三更草堂教程补充理解难点
  • 后续学习时参考黑马程序员的实战案例

二、文档摘要:核心概念速览

Lambda表达式

本质:匿名函数,简化函数式接口的实现

核心语法

复制代码
(参数列表) -> { 代码块 }

省略规则

  1. 参数类型可省略(编译器自动推断)
  2. 单参数可省略括号:s -> System.out.println(s)
  3. 单行代码可省略大括号和return:(a, b) -> a + b

函数式接口

  • 定义:只有一个抽象方法的接口
  • 注解:@FunctionalInterface(编译校验)
  • 常用内置接口:
    • Consumer<T>:消费型,void accept(T t)
    • Supplier<T>:供给型,T get()
    • Function<T, R>:函数型,R apply(T t)
    • Predicate<T>:断言型,boolean test(T t)

使用场景

  • 集合遍历:list.forEach(s -> System.out.println(s))
  • 线程创建:new Thread(() -> System.out.println("执行"))
  • Stream流操作:filter()map()等方法的参数

Stream API

本质:数据处理的流水线,非存储结构

三大阶段

  1. 创建流list.stream()Stream.of()Arrays.stream()
  2. 中间操作 :链式调用,惰性执行
    • filter(Predicate):过滤
    • map(Function):转换
    • sorted():排序
    • distinct():去重
    • limit(n):限制数量
    • skip(n):跳过元素
  3. 终止操作 :触发计算,关闭流
    • collect(Collectors.toList()):收集为列表
    • forEach(Consumer):遍历消费
    • count():计数
    • findFirst():查找第一个

核心特性

  • 不修改源数据(生成新流)
  • 惰性求值(无终止操作不执行)
  • 内部迭代(自动遍历,无需手动循环)
  • 支持并行(parallelStream()一键切换)

典型处理流程

复制代码
List<String> result = list.stream()
    .filter(s -> s.length() > 3)      // 过滤:长度>3
    .map(String::toUpperCase)         // 转换:转大写
    .sorted()                         // 排序:自然顺序
    .collect(Collectors.toList());    // 收集:转为List

三、实战练习题

练习1:Lambda表达式基础

任务:将以下匿名内部类改写成Lambda表达式

复制代码
// 原代码(匿名内部类)
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("任务执行中...");
    }
};

// 要求:改写成Lambda表达式
// 你的代码:

扩展挑战

  • 如果run()方法中有多行代码,如何改写?
  • 如果接口有参数,如何简化写法?

练习2:集合遍历与过滤

任务:使用Stream API完成以下操作

给定学生列表:

复制代码
List<Student> students = Arrays.asList(
    new Student("张三", 85),
    new Student("李四", 62),
    new Student("王五", 91),
    new Student("赵六", 58),
    new Student("孙七", 73)
);

要求

  1. 筛选出成绩≥60分的学生
  2. 提取学生姓名列表
  3. 按成绩降序排序
  4. 统计及格学生人数

模板代码

复制代码
List<Student> passedStudents = students.stream()
    // 1. 过滤条件
    .filter(student -> __________)
    // 2. 排序(降序)
    .sorted(____________________)
    // 3. 收集结果
    .collect(Collectors.toList());

List<String> names = passedStudents.stream()
    // 4. 提取姓名
    .map(____________________)
    .collect(Collectors.toList());

long count = students.stream()
    // 5. 统计及格人数
    .filter(student -> __________)
    .count();

练习3:复杂数据处理

任务:处理订单数据

复制代码
class Order {
    private String orderId;
    private double amount;
    private String customerName;
    // getters/setters
}

List<Order> orders = Arrays.asList(
    new Order("001", 1500.0, "张三"),
    new Order("002", 800.0, "李四"),
    new Order("003", 2500.0, "王五"),
    new Order("004", 500.0, "张三"),
    new Order("005", 1200.0, "李四")
);

要求

  1. 计算所有订单的总金额
  2. 找出金额最大的订单
  3. 按客户分组,统计每个客户的总消费
  4. 筛选出金额>1000的订单,并按金额降序排列

提示函数

  • mapToDouble():转换为Double流
  • sum():求和
  • max():求最大值
  • groupingBy():分组
  • Collectors.summingDouble():分组求和

四、图文总结模板

学习卡片模板

复制代码
# 今日学习主题:Java Lambda表达式

## 核心收获(3个)
1. Lambda是__________,用于简化__________
2. 语法结构:__________ -> __________
3. 必须基于__________接口使用

## 难点与疑问
- 疑问1:如何理解"事实上的final"变量?
- 疑问2:什么时候使用方法引用?

## 代码示例(最深刻的一个)
```java
// 匿名内部类 → Lambda简化对比
list.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});

// Lambda简化版
list.forEach(s -> System.out.println(s));

关联知识

  • 前置:匿名内部类、接口

  • 后续:Stream API、函数式编程

    知识图谱模板

Lambda表达式知识体系

基础概念

  • 本质:匿名函数
  • 语法:(参数) -> {代码}
  • 前提:函数式接口

核心组件

  1. 参数列表

    • 类型推断
    • 单参数省略
    • 无参数:()
  2. 箭头操作符

    • 分隔作用
  3. 方法体

    • 单行省略{}
    • 返回值处理

应用场景

┌─────────┬──────────────┬─────────────────┐

│ 场景 │ 传统写法 │ Lambda简化 │

├─────────┼──────────────┼─────────────────┤

│ 集合遍历│ 匿名内部类 │ list.forEach() │

│ 线程创建│ new Runnable │ () -> {} │

│ 排序 │ Comparator │ (a,b) -> a-b │

└─────────┴──────────────┴─────────────────┘

注意事项

  • 变量作用域限制

  • 异常处理方式

  • 可读性平衡

    五、验收机制

    知识测验(选择题)

    题目1:关于Lambda表达式,以下说法正确的是?
    A) Lambda可以用于任何接口
    B) Lambda表达式必须有明确的返回类型声明
    C) Lambda只能用于函数式接口(只有一个抽象方法)
    D) Lambda表达式会修改源数据

    题目2:以下Lambda写法正确的是?
    A) (int a, b) -> a + b
    B) a -> {return a * 2;}
    C) () -> System.out.println("Hello")
    D) (String s) -> {s.toUpperCase()}

    题目3:Stream API中,以下属于终止操作的是?
    A) filter()
    B) map()
    C) sorted()
    D) collect()

    动手实操任务

    任务名称:学生成绩管理系统数据处理

    需求描述
    给定学生成绩数据,完成以下处理:

    1. 筛选出成绩≥80分的优秀学生
    2. 计算班级平均分
    3. 找出成绩最高的学生
    4. 按分数段分组(90-100:优秀,80-89:良好,60-79:及格,<60:不及格)

    数据准备

    java 复制代码
    List<Student> students = Arrays.asList(
        new Student("Alice", 92),
        new Student("Bob", 78),
        new Student("Charlie", 85),
        new Student("David", 65),
        new Student("Eve", 95),
        new Student("Frank", 58)
    );

要求

  1. 使用Stream API完成所有操作
  2. 确保代码简洁,合理使用方法引用
  3. 输出格式清晰,包含必要的提示信息

扩展挑战

  • 并行处理大数据量(可模拟生成10000条数据)
  • 自定义收集器实现复杂统计

验收标准

  • 知识测验正确率≥80%(3题至少答对2题)
  • 实操任务代码可编译运行,功能完整
  • 能解释核心代码的运作原理

六、学习建议与时间规划

试学时间安排(建议2-3小时)

  1. 第1小时:观看视频教程(建议尚硅谷前2集)

    • 了解Lambda基本概念
    • 掌握基础语法
  2. 第2小时:阅读文档摘要 + 完成练习1-2

    • 巩固理论知识
    • 动手编码实践
  3. 第3小时:完成练习3 + 制作知识总结

    • 复杂场景应用
    • 知识体系梳理

后续学习节奏

  • 工作日每天4小时
    • 1小时视频/文档输入
    • 2小时编码实战
    • 1小时总结输出
  • 每日输出:《今日执行卡片》
  • 每周复盘:《周进展脑图》

遇到困难怎么办?

  1. 概念不理解:回看视频,查阅官方文档
  2. 代码报错:仔细阅读错误信息,逐行调试
  3. 进度滞后:调整学习重点,聚焦核心模块
  4. 需求帮助:技术社区提问(Stack Overflow、掘金)
相关推荐
博语小屋3 小时前
Reactor、epoll下设计一个简单的网络版本计算器
服务器·开发语言·网络·网络协议·http·php
小周学学学3 小时前
vmware的python自动化:批量克隆虚拟机
运维·服务器·python·自动化·vmware
嵌入式×边缘AI:打怪升级日志3 小时前
TCP 网络编程学习笔记
开发语言·php
minglie13 小时前
lean4环境安装
开发语言·前端
chh5633 小时前
从零开始学习C++ -- 基础知识
开发语言·c++·windows·学习·算法
Lzh编程小栈3 小时前
【数据结构与算法】C语言实现双向链表 (Double Linked List) 全解析
c语言·开发语言·数据结构·链表
heimeiyingwang3 小时前
【架构实战】系统设计面试题精选
java·开发语言·架构
星如雨グッ!(๑•̀ㅂ•́)و✧3 小时前
WebFlux综述
java
小疙瘩3 小时前
VirtualBox 下 CentOS-10 下 Docker 安装 Redis
java·docker·容器