跳至主要內容

JDK12新特性

xw大约 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函数

downstream1downstream2聚合后交给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));
}

参考文章