JDK12新特性
大约 2 分钟java基础JDK新特性
JVM
Shenandoah(实验阶段)
添加一个名为Shenandoah的新的垃圾收集(GC)算法,它通过与运行的Java线程并发执行清空工作来减少GC暂停时间。Shenandoah的暂停时间与堆大小无关,这意味着无论堆是200 MB还是200 GB,暂停时间都是一致的。
微基准测试套件
java 12向JDK源代码引入了一套大约100个微基准测试。这些测试将允许在JVM上进行持续的性能测试。
语法
switch表达式增强(预览)
原来老的写法,看起来代码会很臃肿,代码如下:
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
String typeOfDay = "";
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
typeOfDay = "Working Day";
break;
case SATURDAY:
case SUNDAY:
typeOfDay = "Day Off";
}
新的语法如下,更加紧凑
typeOfDay = switch (dayOfWeek) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";
case SATURDAY, SUNDAY -> "Day Off";
};
新增方法
teeing函数
downstream1
和downstream2
聚合后交给merger
函数处理,定义如下,
Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,
Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)
实例:
public void givenSetOfNumbers_thenCalculateAverage() {
double mean = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.teeing(Collectors.summingDouble(i -> i),
Collectors.counting(), (sum, count) -> sum / count));
assertEquals(3.0, mean);
}
string类新增函数
transform
函数,接收一个单一参数函数作为参数。实例如下:
public void givenStringThenRevertValue() {
String text = "Baeldung";
String transformed = text.transform(value ->
new StringBuilder(value).reverse().toString()
);
assertEquals("gnudleaB", transformed);
}
indent
函数,根据参数传入的数值进行空格的添加和删除,如果数值大于0,在每一行前面加指定数值的空格,如果小于0则删除空格,代码实例如下:
String text = "Hello Baeldung!\nThis is Java 12 article.";
text = text.indent(4);
System.out.println(text);
text = text.indent(-10);
System.out.println(text);
输出如下:
Hello Baeldung!
This is Java 12 article.
Hello Baeldung!
This is Java 12 article.
File::mismatch方法
用来查找两个文件第一个字节不匹配的位置,如果两个文件一模一样,返回-1
public static long mismatch(Path path, Path path2) throws IOException
示例如下:
@Test
public void givenIdenticalFiles_thenShouldNotFindMismatch() {
Path filePath1 = Files.createTempFile("file1", ".txt");
Path filePath2 = Files.createTempFile("file2", ".txt");
Files.writeString(filePath1, "Java 12 Article");
Files.writeString(filePath2, "Java 12 Article");
long mismatch = Files.mismatch(filePath1, filePath2);
assertEquals(-1, mismatch);
}
@Test
public void givenDifferentFiles_thenShouldFindMismatch() {
Path filePath3 = Files.createTempFile("file3", ".txt");
Path filePath4 = Files.createTempFile("file4", ".txt");
Files.writeString(filePath3, "Java 12 Article");
Files.writeString(filePath4, "Java 12 Tutorial");
long mismatch = Files.mismatch(filePath3, filePath4);
assertEquals(8, mismatch);
}
数字格式化
public static NumberFormat getCompactNumberInstance(Locale locale, NumberFormat.Style formatStyle)
示例:
@Test
public void givenNumber_thenCompactValues() {
NumberFormat likesShort =
NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
likesShort.setMaximumFractionDigits(2);
assertEquals("2.59K", likesShort.format(2592));
NumberFormat likesLong =
NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
likesLong.setMaximumFractionDigits(2);
assertEquals("2.59 thousand", likesLong.format(2592));
}