1. switch的模式匹配 (instanceof-and-cast)
-
if
static String formatter(Object o) { String formatted = "unknown"; if (o instanceof Integer i) { formatted = String.format("int %d", i); } else if (o instanceof Long l) { formatted = String.format("long %d", l); } else if (o instanceof Double d) { formatted = String.format("double %f", d); } else if (o instanceof String s) { formatted = String.format("String %s", s); } return formatted; }
-
switch 重写
static String formatterPatternSwitch(Object o) { return switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); }; }
-
模式匹配和null
static void testFooBar(String s) { switch (s) { case null -> System.out.println("Oops"); case "Foo", "Bar" -> System.out.println("Great"); default -> System.out.println("Ok"); } }
-
String s将匹配 null值和所有String值:
static void testStringOrNull(Object o) { switch (o) { case null, String s -> System.out.println("String: " + s); } }
-
细化模式switch
对模式的实验switch表明,想要改进模式是很常见的。考虑以下切换Shape值的代码:class Shape {} class Rectangle extends Shape {} class Triangle extends Shape { int calculateArea() { ... } } static void testTriangle(Shape s) { switch (s) { case null: break; case Triangle t: if (t.calculateArea() > 100) { System.out.println("Large triangle"); break; } default: System.out.println("A shape, possibly a small triangle"); } }
-
static void testTriangle(Shape s) { switch (s) { case Triangle t && (t.calculateArea() > 100) -> System.out.println("Large triangle"); case Triangle t -> System.out.println("Small triangle"); default -> System.out.println("Non-triangle"); } }
描述
switch我们通过两种方式增强语句和表达式:-
扩展case标签以包含除常量之外的模式,以及
-
引入两种新的模式:保护模式和括号模式。
-
2. 增强型伪随机数发生器
JDK7为伪随机数生成器(PRNG)提供新的接口类型和实现,使程序使用各种PRNG算法更加容易,更好的支持流式编程。
提供了一个新的接口 RandomGenerator ,为所有PRNG算法提供统一的API,同时提供了一个新的类 RandomGeneratorFactory 来构造各种 RandomGenerator 实例。
public static void main(String[] args) {
//生成10个10以内的随机数
RandomGeneratorFactory<RandomGenerator> L128X1024MixRandom = RandomGeneratorFactory.of("L128X1024MixRandom");
RandomGenerator randomGenerator = L128X1024MixRandom.create(System.currentTimeMillis());
for (int i = 0; i < 10; i++) {
System.out.println(randomGenerator.nextInt(10));
}
}
RandomGeneratorFactory.all() 方法可以获得所有随机数生成算法,输出所有随机算法名称:
public static void main(String[] args) {
RandomGeneratorFactory.all().forEach(e -> System.out.println(e.group() + "-" + e.name()));
}
LXM-L32X64MixRandom
LXM-L128X128MixRandom
LXM-L64X128MixRandom
Legacy-SecureRandom
LXM-L128X1024MixRandom
LXM-L64X128StarStarRandom
Xoshiro-Xoshiro256PlusPlus
LXM-L64X256MixRandom
Legacy-Random
Xoroshiro-Xoroshiro128PlusPlus
LXM-L128X256MixRandom
Legacy-SplittableRandom
LXM-L64X1024MixRandom
3. Sealed Classes(密封类) 转正
密封类(Sealed Classes)是JDK15引入的,在JDK17正式转正。
密封类可以对继承或者实现他们的类进行限制。
//Person类被 sealed 修饰,只允许(permits)Male和Female类继承,继承的类必须有 final 或者 no-sealed 来修饰。
//Function接口被 sealed 修饰,只允许(permits)Male和Female类实现,实现的类必须有 final 或者 no-sealed 来修饰
public static void main(String[] args) {
Male male = new Male();
male.eat();
Female female = new Female();
female.eat();
}
static sealed class Person permits Male, Female {
}
static final class Male extends Person implements Function {
@Override
public void eat() {
System.out.println("eat 1");
}
}
static non-sealed class Female extends Person implements Function {
@Override
public void eat() {
System.out.println("eat 2");
}
}
sealed interface Function permits Male, Female {
void eat();
}
Function {
@Override
public void eat() {
System.out.println(“eat 2”);
}
}
sealed interface Function permits Male, Female {
void eat();
}