本阶段涵盖:比较器排序与 Lambda、函数式编程与 Stream 流 细分文档:
按日细分/20260803-笔记.md、按日细分/20260804-笔记.md学生需要重点理解、背诵、掌握的理论核心知识点。
| 排序方式 | 实现 | 场景 |
|---|---|---|
| 自然排序 Comparable | 实体类实现 Comparable,重写 compareTo(T o) |
类设计期确定默认规则 |
| 比较器排序 Comparator | 创建集合时传入 Comparator,重写 compare() |
类已定稿、临时自定义排序 |
| 返回值 | 含义 | 处理结果 |
|---|---|---|
| 负数 | 当前元素小 | 存左边 |
| 0 | 与已有元素"重复" | 不存(去重) |
| 正数 | 当前元素大 | 存右边 |
官方推荐:compareTo == 0 时 equals 返回 true、hashCode 一致——排序/相等/哈希判定一致,去重才符合预期。 ⚠️ 只用单个属性排序时,属性相同会"丢"元素 → 叠加二次比较(如先年龄后姓名)。
交换 compare/compareTo 两个参数的位置即可降序:Double.compare(o.getSalary(), this.salary) = 薪资降序。
| 方法 | 作用 |
|---|---|
sort(List) |
自然升序(元素必须 Comparable) |
sort(List, Comparator) |
自定义排序 |
reverse(List) |
逆序 |
binarySearch(List, key) |
二分查找(必须先排序) |
max/min(List) |
最大/最小 |
unmodifiableList(List) |
转不可变集合 |
shuffle/fill/swap/rotate/replaceAll |
打乱/填充/交换/旋转/替换 |
int... a 本质就是数组(int[] a),方法内 foreach 遍历Lambda(JDK 8)= 简化匿名内部类的写法。
标准格式: (形式参数) -> {代码块}(三要素:参数、箭头、代码块)
只有一个抽象方法的接口叫函数式接口。Lambda 只能用于函数式接口。
JDK 内置函数式接口(java.util.function 包):
| 接口 | 形态 |
|---|---|
Supplier<T> |
无参有返回值 |
Consumer<T> |
有参无返回值 |
Function<T,R> |
有参有返回值 |
Predicate<T> |
有参返回 boolean(断言) |
(s) -> → s ->(a, b) -> a + bCollections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());
TreeSet<Employee> set = new TreeSet<>(Comparator.comparing(Employee::getName));
函数式编程:把计算看作数学中的函数计算,程序由函数组合构成(而非语句序列)。 五大特点:不可变性、高阶函数、函数组合(核心)、无副作用、延迟求值。
Stream 流才是真正把函数式编程引入 Java。
| 类别 | 作用 | 特点 |
|---|---|---|
| 获取方法 | 创建流水线 | 起点(.stream()) |
| 中间方法 | 流水线操作 | 返回新 Stream,可链式调用 |
| 终结方法 | 最后一个操作 | 只能有一个,调用后流结束 |
| 数据来源 | 生成方式 |
|---|---|
| Collection 集合 | 集合.stream() |
| Map 集合 | map.keySet().stream() / map.values().stream() |
| 数组 | Arrays.stream(数组) |
| 零散数据 | Stream.of(T... values)(可变参数) |
Map 不是 Collection 体系,需先转 Set/Collection 再 stream()。
| 方法 | 作用 |
|---|---|
filter(Predicate) |
过滤 |
limit(n) |
截取前 n 个 |
skip(n) |
跳过前 n 个 |
map(Function) |
映射(元素转另一种类型) |
concat(a, b) |
合并两个流(静态方法) |
distinct() |
去重(依赖 equals) |
limit + skip组合实现分页:skip((pageNo-1)*pageSize).limit(pageSize)。
| 形式 | 写法 | 示例 |
|---|---|---|
| 类的静态方法 | 类名::静态方法名 |
String::valueOf |
| 对象的实例方法 | 对象名::方法名 |
sb::append |
| 类的实例方法 | 类名::方法名 |
String::substring |
| 类的构造方法 | 类名::new |
String::new |
使用前提:方法体只有一行代码,且抽象方法的所有参数按顺序传入被引用方法。
类名::方法名形式下,抽象方法第一个参数就是调用成员方法的对象。
| 方法 | 作用 |
|---|---|
forEach(Consumer) |
遍历(参数是有参无返回值) |
count() |
计数(返回 long) |
| 方法 | 收集目标 |
|---|---|
Collectors.toList() |
List(不可变) |
Collectors.toSet() |
Set(天然去重) |
Collectors.toMap(keyMapper, valueMapper) |
Map(键必须唯一,冲突抛 IllegalStateException) |
Stream.toList() |
List(不可变) |
toArray() |
数组 |
List<String> nameList = list.stream().map(Student::getName).collect(Collectors.toList());
Map<Integer, Student> map = list.stream().collect(Collectors.toMap(s -> s.getId(), s -> s));
:: 四种形式:静态/对象实例/类实例/构造