Java 12 的新特性
甲骨文于 2019 年 3 月 19 日发布了 Java SE(标准版)12,之后他们计划每六个月发布一次新版本。JDK 12 比 JDK 11 有很多改进。这个最新版本提供了一系列新功能,如开关表达式、默认光盘档案、Shenandoah、微基准套件等。这些新功能将在下面讨论。
1。 开关表达式的变化:
开关表达式现在将用作语句和表达式。这使得开关的代码简化和模式匹配成为可能。
- In earlier versions, the absence of the break statement would lead to error-prone default failure.
- Default is mandatory in the switch expression.
现在,交换机的新箭头语法介绍如下
case X -> {}
表示只有当标签匹配时,才会执行箭头右侧的语句。
Java 11 和 Java 12 的 Switch 表达式可以比较如下:
Java 11T4
Java
T7
// Java program to demonstrate the
// classic switch statement
import java.io.*;
class Java11switchStatement {
static int getMealNumber(String meal)
{
// stores mealNumber
int mealNumber;
// classic switch statement
switch (meal) {
case "SOUP":
mealNumber = 1;
break;
case "BURGER":
case "CHIPS":
case "SANDWICH":
mealNumber = 2;
break;
case "SPAGETTI":
case "MACRONI":
mealNumber = 3;
break;
default:
throw new IllegalStateException(
"Cannot prepare " + meal);
}
return mealNumber;
}
public static void main(String[] args)
{
// define meal
String meal = "BURGER";
// print mealNumber
System.out.println("The mealNumber is : "
+ getMealNumber(meal));
}
}
T8T10输出T1
Java 12
Java
// Java program to demonstrate the
// new switch expression
import java.io.*;
class Java11switchStatement {
// returns mealNumber
static int getMealNumber(String meal)
{
// stores mealNumber using
// new switch expression
int mealNumber = switch (meal)
{
case "SOUP" -> 1;
case "BURGER", "CHIPS", "SANDWICH" -> 2;
case "SPAGETTI", "MACRONI" -> 3;
default -> throw new IllegalException("");
}
return mealNumber;
}
public static void main(String[] args)
{
// define meal
String meal = "BURGER";
// print mealNumber
System.out.println("The mealNumber is : "
+ getMealNumber(meal));
}
}
输出
The mealNumber is : 2
2。 谢南多亚(全新改良的垃圾收集器)
这是一个实验特性,引入了一个新的垃圾收集(GC)算法,Shenandoah。它通过与运行的 Java 线程并发执行疏散工作来提供低暂停时间。因此,暂停时间与堆大小无关。例如,5MB 堆的暂停时间与 10GB 堆相同。
3。 JVM 常量 API :这个 API 帮助那些操纵类和方法的程序。这些程序需要对字节代码指令进行建模,并处理可加载的常量。字符串或整数类型的常量也可以。然而,使用常量类型作为类变得很棘手。如果类不可访问或不存在,加载类可能会失败。有了新的应用编程接口,类描述符、方法类型描述符、方法句柄描述符和动态实例描述符等接口可以象征性地处理常量值,从而消除复杂性。
4。G1可移植混合收集:默认垃圾收集器“垃圾优先”(G1)使用分析引擎来确定收集集,一旦收集开始,所有活动对象都应被收集而不会停止。这会导致超过目标暂停时间。为了解决这个问题,G1 收集组被分成可选部分和强制部分。通过对强制设置进行优先级排序,可以经常实现暂停时间目标。
5。默认的 CDS 归档文件:创建了一个类数据共享(CDS)归档文件,以使 JDK 构建过程更加高效,从而提高开箱即用的启动时间。
6。 微基准测试套件:通过添加到 JDK 源代码的微基准测试套件,开发人员可以轻松运行现有的或新的基准测试。
7。迅速从 G1 返回未使用的提交内存:通过这个改进的特性,当 G1 空闲时,垃圾收集器会自动将未使用的堆内存返回给操作系统。这是通过 G1 对 Java 堆的并发检查来完成的。
8) Files.mismatch()方法:这个新方法比较两个文件。
方法签名
public static long mismatch(Path path1, Path path2) throws IOException
返回: -1L 如果没有不匹配其他第一个不匹配的位置 。
它返回两种情况下不匹配的位置。
- Case 1 : If the file sizes do not match. Here, the size of the smaller file is returned.
- Case 2 : If the bytes do not match. Here, the first unmatched byte is returned.
示例:
Java 语言(一种计算机语言,尤用于创建网站)
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class FilesCompareExample {
public static void main(String[] args)
throws IOException
{
Path path1 = Files.createTempFile("file1", ".txt");
Path path2 = Files.createTempFile("file2", ".txt");
Files.writeString(path1, "Geeks for geeks");
Files.writeString(path2, "Geeks for geeks");
long mismatch1 = Files.mismatch(path1, path2);
System.out.println(
"File Mismatch position or -1 is returned if there is no mismatch");
System.out.println(
"Mismatch position in file1 and file2 is : "
+ mismatch1);
path1.toFile().deleteOnExit();
path2.toFile().deleteOnExit();
System.out.println();
Path path3 = Files.createTempFile("file3", ".txt");
Path path4 = Files.createTempFile("file4", ".txt");
Files.writeString(path3, "Geeks for geeks");
Files.writeString(path4, "Geeks for the geeks");
long mismatch2 = Files.mismatch(path3, path4);
System.out.println(
"Mismatch position in file3 and file4 is : "
+ mismatch2);
path3.toFile().deleteOnExit();
path4.toFile().deleteOnExit();
}
}
输出
Mismatch position in file1 and file2 is : -1
Mismatch position in file3 and file4 is : 10
9)紧凑数字格式:由于空间限制,这是应用于通用数字(如十进制、货币、百分比)的格式,使其紧凑。在下面的示例中,1000 将被格式化为短样式的“1K”和长样式的“1000”。
爪哇
import java.text.NumberFormat;
import java.util.Locale;
public class CompactFormatExample {
public static void main(String[] args)
{
NumberFormat fmtLong
= NumberFormat.getCompactNumberInstance(
Locale.US, NumberFormat.Style.LONG);
System.out.println(fmtLong.format(100));
System.out.println(fmtLong.format(1000));
System.out.println(fmtLong.format(10000));
NumberFormat fmtShort
= NumberFormat.getCompactNumberInstance(
Locale.US, NumberFormat.Style.SHORT);
System.out.println(fmtShort.format(100));
System.out.println(fmtShort.format(1000));
System.out.println(fmtShort.format(10000));
}
}
输出
100
1 thousand
10 thousand
100
1K
10K
10)Stream API 中的teeting Collectors:Collectors . teeting()是新的辅助函数,有助于将两步函数执行到一步中。这导致代码不太冗长。
方法签名
public static Collector teeing (Collector downstream1, Collector downstream2, BiFunction merger);
这里,我们在两个不同的收集器上执行两个不同的流操作,结果使用提供的双功能进行合并。
例:
爪哇
import java.io.*;
import java.util.*;
class TeeingCollectorsExample {
public static void main(String[] args)
{
double mean
= Stream.of(2, 3, 4, 5, 6)
.collect(Collectors.teeing(
summingDouble(i -> i), counting(),
(sum, n) -> sum / n));
System.out.println(mean);
}
}
输出
4.0
11) Java String 新方法 : Java 12 在 String 类中引入了以下新方法:
i) 缩进(int n) :它根据传递的参数调整给定字符串每行的缩进。
根据通过的 n 的值,我们可以有以下情况:
- If n > 0 , insert a space at the beginning of each line.
- If n < 0 , delete the space at the beginning of each line.
- If n < 0 and n < have available spaces , delete all leading spaces [T13
输出
**********
Welcome
Good Morning
**********
**********
Welcome
Good Morning
**********
**********
Welcome
Good Morning
**********
二)变换(功能<?超级字符串,?扩展 R > f) :用于调用一个需要字符串参数的函数,产生结果 R
String s = "Java,Python,Angular";
List result = s.transform(s1 -> {return Arrays.asList(s1.split(","));});
System.out.println(result);
输出
[Java, Python, Angular]
iii)可选的<字符串> describeConstable() :该方法将返回一个可选的对象,该对象包含字符串实例的描述符。
String message = "Welcome!";
Optional<String> opOfMessage = message.describeConstable();
System.out.println(opOfMessage);
输出
Optional[Welcome!]
iv)字符串解析标准描述(方法句柄。查找查找):这个方法将返回一个字符串对象,它是调用字符串实例的描述符。
String message = "Welcome!";
String constantDesc = message.resolveConstantDesc(MethodHandles.lookup());
System.out.println(constantDesc);
输出
Welcome!
尽管与 Java 8 相比,Java 12 还没有获得普及,但是新特性的增加更加频繁,使得 Java 可以与其他语言的更好特性相媲美,从而保持了它在市场上的普及。
版权属于:月萌API www.moonapi.com,转载请注明出处