JDK8
- Lambda表达式
(parameter1, parameter2, ..., parameterN) -> {
// Lambda表达式的代码块
}
// 使用Lambda表达式对集合元素进行遍历操作
List<String> list = Arrays.asList("Java", "Python", "C++", "JavaScript");
list.forEach(str -> System.out.println(str));
// 使用Lambda表达式对集合进行过滤操作
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 使用Lambda表达式对集合进行排序操作
List<String> names = Arrays.asList("Tom", "Jerry", "Alice", "Bob");
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
// 自定义函数式接口并使用Lambda表达式进行实现
interface MyFuncInterface {
int apply(int a, int b);
}
MyFuncInterface add = (a, b) -> a + b;
MyFuncInterface multiply = (a, b) -> a * b;
System.out.println(add.apply(2, 3)); // 输出5
System.out.println(multiply.apply(2, 3)); // 输出6
- Stream API
- Default 方法
默认方法可以有方法体,可以被其它实现该接口的类直接调用;
默认方法可以被覆盖,这样实现该接口的类可以使用自己的实现;
默认方法可以被标记为 abstract,这意味着实现该接口的类必须提供该方法的实现;
如果一个类实现了多个接口,并且这些接口有相同的默认方法,那么实现该接口的类必须覆盖该默认方法。
public interface InterfaceName {
public void normalMethod();
default void defaultMethod() {
// 默认实现
}
}
- 可重复注解
- 时间日期API
- 函数式接口
- CompletableFuture
异步编程API,future获取异步操作结果,callback用于异步操作完成后的逻辑。
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
// 创建一个CompletableFuture对象,并指定异步操作
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, CompletableFuture!";
});
// 设置回调函数,在异步操作完成后处理结果
future.thenAccept(result -> System.out.println(result));
// 主线程继续执行其他任务
System.out.println("Main thread continues...");
// 等待异步操作完成
future.join();
}
}
JDK11
- HTTP Client API
- var本地类型推荐
- ZGC垃圾收集器
- Unicode10 支持
- 新的字符串方法
strip():去除字符串首尾空格
stripLeading():去除字符串开头空格
stripTrailing():去除字符串结尾空格
repeat():重复指定次数字符串 - 空判断操作符
expression1 ?? expression2
expression1为需要判空的表达式,不空返回表达式的值,空则返回右侧的值 - 新的集合工厂方法
创建一个包含多个元素的List集合对象:
List list = List.of(“A”, “B”, “C”);
创建一个空的Set集合对象:
Set set = Set.of();
创建一个包含多个键值对的Map集合对象:
Map<String, Integer> map = Map.of(“A”, 1, “B”, 2, “C”, 3);
这些方法使用了Java 9中引入的工厂方法特性,它们都返回了不可变的集合对象。这些不可变的集合对象与传统的集合对象的最大区别在于它们不支持修改操作。如果尝试在不可变的集合对象上进行修改操作,将会抛出UnsupportedOperationException异常。
JDK17
- Sealed Classes
Sealed Classes是Java 15中引入的一种新特性。它通过限制类和接口的可访问继承者,来增强类型检查和安全性。
Sealed Classes有两个关键元素:sealed和permits。sealed用来声明一个类或接口是“密封”的,即只有在该类或接口中声明的类或接口才能继承或实现它。而permits用来声明所允许继承或实现的类或接口。
sealed 声明该类是一个密封类,permits表示只有car和truck才可以继承或实现它
public sealed class Vehicle permits Car, Truck
- Pattern Matching for switch (Preview)
以在 switch 语句中使用更复杂的条件判断,比如使用 instanceof 进行类型判断,以及使用表达式进行匹配。
使用 Pattern Matching for switch (Preview) 需要在 switch 语句中使用关键字 case,后接一个要匹配的模式,然后在箭头后面执行相应的操作。这种模式匹配的方式可以用于匹配对象类型、枚举类型以及其他类型。
public static void patternMatch(Object obj) {
switch (obj) {
case String str -> System.out.println("字符串: " + str);
case Integer integer -> System.out.println("整数: " + integer);
case List<?> list -> System.out.println("列表: " + list);
default -> System.out.println("未知类型");
}
}
- Record
语法糖,用于定义不可变的数据类。通过自动生成基本的类方法(如equals、hashCode和toString等)来简化开发人员的工作,并且保证了数据类的不可变性。有利于多线程环境下的使用
public record Person(String name, int age) {}
上面的代码定义了一个Person类,包含了两个属性:name和age。这个类是不可变的,即所有属性都是final的,并且没有setter方法。
在底层实现上,编译器会自动生成以下方法:
• 构造方法:用于初始化类的属性。
• equals:用于比较两个对象是否相等。
• hashCode:用于计算对象的哈希值。
• toString:用于将对象转换成字符串表示。 - Vector API (Incubator)
利用CPU SIMD提高计算效率
public class VectorAddition {
public static void main(String[] args) {
// 创建两个长度为 8 的浮点型数组
float[] a = new float[8];
float[] b = new float[8];
// 用随机值填充数组
for (int i = 0; i < a.length; i++) {
a[i] = (float) Math.random();
b[i] = (float) Math.random();
}
// 将数组转换为向量
var va = FloatVector.fromArray(a, 0);
var vb = FloatVector.fromArray(b, 0);
// 向量相加
var vc = va.add(vb);
// 将结果数组转换为普通数组
float[] c = new float[8];
vc.intoArray(c, 0);
// 打印结果数组
System.out.println(Arrays.toString(c));
}
}
-
Strongly Encapsulate JDK Internals
是指在Java 9 中增强了JDK内部的封装。 -
Foreign Function & Memory API (Incubator)
Foreign Function & Memory API 是 JDK 17 的一个新特性,它可以在 Java 中直接调用 C 和 C++ 库的函数,并且可以直接访问 C 和 C++ 的内存。 -
New Socket API
新的 Socket API 是 Java SE 9 中引入的一个重要更新。它增强了 Java 网络编程的效率和可靠性, -
Enhanced Pseudo-Random Number Generators
新的伪随机数生成器,更安全可靠
public class RandomNumberGenerator {
public static void main(String[] args) {
SecureRandom random = new SecureRandom();
byte[] bytes = new byte[16];
random.nextBytes(bytes);
System.out.println("Random bytes: " + bytes);
}
}
- Deprecate the Applet API
由于Applet API已经过时,Java SE Development Kit 17 (JDK 17)决定废弃它。
useful link
JDK8
JDK8&JDK11
JDK11&JDK17
JDK17