
Java版本新特性
Java版本新特性
Java8
lamdba表达式
Lambda 表达式是 Java 8 引入的简化语法,用来简化匿名内部类的写法,专门用于创建函数式接口的实例,让代码更简洁、更优雅。
一、什么是匿名内部类
匿名内部类 = 没有名字的局部内部类,一次性使用、当场定义、当场使用。
最简单的对比:
1 | // 正常写法 |
二、什么是函数式接口
只有一个抽象方法的接口(default、static接口不用管),就是函数式接口。
Lambda 只能用在这种接口上!
三、Lambda 标准语法
1 | (参数列表) -> { 方法体 } |
极简规则(越写越短)
- 参数类型可以省略(编译器自动推断)
- 只有一个参数时,小括号可以省略
- 方法体只有一行代码时,大括号、return、分号都可以省略
1 | // 旧写法:匿名内部类(啰嗦) |
例如最常用的forEach实现起来是这样的
1 | List<BusiTextbook> list = busiTextbookService.list(queryWrapper); |
stream流
stream是对集合(List/Set)的操作简化工具
一、最常用的句式
1 | 1. 获取流 → list.stream() |
二、常用操作
1 | // 找出年龄大于18的用户 |
Optional 类
避免空指针异常 NullPointerException
实例:
1 | // 以前的判空 |
接口默认方法和静态方法
静态方法特点
- 有方法体
- 用 static 修饰
- 属于接口自己,必须接口名调用
- 不能被实现类继承
- 不能被重写
默认方法特点:
- 有方法体
- 用 default 修饰
- 属于实例方法,必须对象调用
- 实现类可以不重写,直接继承使用
- 实现类也可以重写覆盖它
1 | public interface MyInterface { |
Java11
String 类新增 4 个实用方法
isBlank () → 判断是否为空
1
2String str = " ";
str.isBlank(); // true空格、空串、tab、换行 → 都算空
strip () → 去除空白
1
2String str = " 你好 ";
str.strip(); // "你好"能去除 全角空格、Unicode 空白字符
repeat (n) → 重复字符串
1
"*".repeat(10); // **********
lines () → 按行分割成流
1
2String str = "第一行\n第二行\n第三行";
str.lines().forEach(System.out::println);
局部变量类型推断(var)
用 var 代替局部变量的具体类型,编译器自动推断类型
一、用法
传统写法:
1 | String name = "张三"; |
var写法
1 | var name = "张三"; // 编译器推断为 String |
增强for循环
1 | for (var item : list) { |
try资源关闭
1 | try (var is = new FileInputStream("a.txt")) { |
二、规则
var 只能用在局部变量
必须当场初始化,不能只声明不赋值
推断后类型就固定,不能再乱赋值别的类型
匿名子类、复杂泛型 也能自动推断,简化代码
ZGC垃圾回收器
一、特点
低延迟天花板
STW 停顿基本 1ms 左右,用户几乎感知不到卡顿。
堆再大也不卡
G1、堆越大停顿越久;ZGC 堆大小和停顿时间几乎没关系。
全程大部分并发
只有两次极短暂停顿,其余回收全程和业务线程一起跑。
自带内存整理,几乎无内存碎片
二、核心技术
- 染色指针:64 位指针里存 GC 标记状态,不用频繁扫对象
- 读屏障:访问对象自动修复引用,不卡顿
- 多重虚拟内存映射:实现对象并发搬家不阻塞业务
Java17
records
Record 是 Java 原生极简数据载体类,专门用来做:DTO、实体、值对象、只读数据传输
1 | // 三个参数 |
等价于你手写一整个标准 POJO:
- 私有 final 成员变量
- 全参构造器
- 自动生成
id()、name()、age()访问方法(不是 getId!是 id ()) - 自动重写 equals ()、hashCode ()、toString ()
- 添加一个自定义方法
密封类
精确控制谁能继承我、谁能实现我
不再是普通类随便谁都能 extends / implements,
父类可以指定允许的子类名单,没在名单里的直接编译报错。
关键词:
sealed(密封)、permits(允许)、non-sealed(非密封)
密封父类 + 指定允许子类
1
2
3// 密封类:只允许 Circle、Rectangle 继承
public sealed class Shape permits Circle, Rectangle {
}被允许的子类 只能三种写法
final 最终类,不能再被继承
sealed 继续密封,再限制下一级子类
non-sealed 解封,放开随便继承
写法 1:子类加 final(常用)
1
2
3// 不能再被别人继承
public final class Circle extends Shape {
}1
2public final class Rectangle extends Shape {
}写法 2:子类继续 sealed
1
2
3
4
5public sealed class Triangle extends Shape permits RightTriangle {
}
public final class RightTriangle extends Triangle {
}写法 3:子类 non-sealed 放开继承
1
2
3// 解封:任何人都可以继承我
public non-sealed class Square extends Shape {
}
模式匹配instanceof
1 | Object obj = "我是字符串"; |
Java21
虚拟线程
虚拟线程是 JVM 实现的用户态轻量级线程,廉价、海量、不用线程池
- 传统线程:平台线程(Platform Thread),1:1 映射操作系统内核线程,成本高、数量有限
- 虚拟线程:由 JVM 调度管理,不直接绑定 OS 内核线程,极轻量、可百万级并发
springboot整合虚拟线程:
1 | /** 创建虚拟线程配置文件 */ |
1 |
|
switch类型判断
1 | // 🔥 Java 21 模式匹配 switch:判断类型 |
- 感谢你赐予我前进的力量







