- A categorized list of all Java and JVM features since JDK 8 to 18
- Exploring the New HTTP Client in Java
本文写作时在 JDK 8 之后有 11 和 17 两个 LTS 版本。由于 JDK 9 不是 LTS 版本,该版本中引入的不可变集合实例工厂方法划入 JDK 11 章节,其他编排同理。
JDK 11
不可变集合实例的工厂方法
List<Integer> list = List.of(1, 2, 3);
Map<String, String> map = Map.of(key1, value1, key2, value2);
Optional::orElseThrow 和 Optional::ifPresentOrElse
userRepository.findById(userId) 查询得到 user: Optional<User>,原有写法可以是:
if (user.isPersent()) {
return user.get();
} else {
throw new NoSuchElementException();
}
return user.orElseThrow() 可以在 user 不存在时直接抛出 NoSuchElementException。当然抛出其他异常也是可以的 return user.orElseThrow(IllegalArgumentException::new)。
Optional::ifPresentOrElse 则接受 Consumer<T> action 和 Runnable emptyAction 两个参数,如果 value 存在,执行 action,不存在则执行 emptyAction,不过这样的话 user 就被消费掉了。
user.ifPresentOrElse(
(v) -> logUserAction(v),
() -> logNoSuchUserException();
);
var 类型推断
通过 var 省略局部变量的类型声明,也可以在 Lambda 表达式中使用。
var roleMap: Map<UserRole, List<Long>> = roleService.getRoleMapByUserId(userId);
java.net.http 中的标准化 HttpClient API
- Builder 模式构造请求
- 支持异步
- Push Promises in HTTP/2
- ……
主要分 java.net.http.HttpClient,java.net.http.HttpRequest 和 java.net.http.HttpResponse 三部分,具体使用可查看参考资料。
接口中允许私有方法
可以在 Interface 中添加 private 方法和 private 静态方法:
- 接口中
private方法只能由接口内部的方法调用 - 接口中
private静态方法可以在其他静态和非静态接口方法中使用
Try-with-resources allows effectively final variables
BufferedReader br1 = new BufferedReader(...);
BufferedReader br2 = new BufferedReader(...);
try (br1; br2) {
System.out.println(br1.readLine() + br2.readLine());
}
// 需要注意 br1 和 br2 在这里已经被释放了,不要尝试使用
一些过于简单或有待深入讨论需要将来添加例子的内容
- Reactive Streams publish-subscribe framework for asynchronous stream processing with non-blocking back pressure
- Time-based enhancements to
CompletableFuture(timeout, delay) - More options to transform (
dropWhile,takeWhile) and generate (iterate,ofNullable) streams; readonly collectors (toUnmodifiableList); optionals can be transformed to streams Arrays.mismatch: find the first mismatching element between two arrays
JDK 17
switch 表达式
如果 switch-case 中的分支只需要执行较简单的任务并返回一个值
switch(day) {
case MONDAY, TUESDAY ... FRIDAY -> "workday";
case SATURDAY, SUNDAY -> "weekend";
default -> "invalid";
}
模式匹配
节省了强制类型转换,并且转换后的子类型可以当即参与条件判断。
使用 switch-case 结构:
switch(vehicle) {
case Car c -> // return something
case Truck t && t.wheels > 8 -> // return something else
default -> throw new IllegalArgumentException("Not a known vehicle type");
}
使用 instanceof:
if (vehicle instanceof Car c) {
c.addPassenger(new Passenger());
} else if (vehicle instanceof Truck t && t.getNumberOfWheels() > 6) {
t.loadCargo(new Cargo());
} else {
throw new IllegalArgumentException("Not a known vehicle type");
}
Stream::toList
List<UserVO> userList = Stream.of().collect(Collectors.toList()):
// 简化为
List<UserVO> userList = Stream.of().toList();
需注意 Stream::toList 返回 ImmutableList。
文本块
String blockOfText = """
First line
Second line
""";
record class
用于表示不可修改的纯数据类,在大部分场景下可以代替 DTO 和 VO。
// Point 类型表示二维平面上的一个点
public record Point(int x, int y) {}
该场景使用 Class 则需要实现(包括使用 Lombok)构造函数、getters、toString、equals 和 hashCode。
更详细的 NullPointerException
Wheel wheel = city.getParkingLot(0).getCar(0).getWheel(0);
// 现在 NullPointerException 可以携带是哪一级出了问题的信息
密封类 Sealed Class
可以限制其他类扩展,在模式匹配中就不需要指定 default 情况了。
public abstract sealed class Shape permits Circle, Rectangle {...}
public final class Circle extends Shape {...} // OK
public final class Triangle extends Shape {...} // Compile error
如果需要给枚举添加更多逻辑,密封类也是一个较好的选择,可以使用 getPermittedSubclasses获取子类。
一些过于简单或有待深入讨论需要将来添加例子的内容
Stream.mapMultito replace each element of this stream with zero or more elements, an alternative toflatMapCollectors.teeingto create a Collector that is a composite of two downstream collectors@Serialto indicate fields and methods that are part of the serialization mechanism (e.g.serialVersionUIDandreadObject)- jlink is a tool that generates a custom Java runtime image that contains only the platform modules that are required for a given application
- jpackage is a command-line tool to create native installers and packages for Java applications