Java 12(2019 年 3 月 19 日发布)是可用于 JDK 的最新版本。让我们看看它为开发人员和架构师带来的新功能和改进。
1. Stream API 中的 Collectors.teeing()
teeing 收集器已公开为静态方法Collectors::teeing。该收集器将其输入转发给其他两个收集器,然后将它们的结果与函数合并。
teeing(Collector, Collector, BiFunction)
接受两个收集器和一个合并其结果的函数。传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将它们的结果合并到最终结果中。
例如,在给定的员工列表中,如果我们想找出最高薪水和最低薪水的员工,我们可以使用 teeing collector 在单个语句中完成。
SalaryRange salaryRange = Stream
.of(56700, 67600, 45200, 120000, 77600, 85000)
.collect(teeing(
minBy(Integer::compareTo),
maxBy(Integer::compareTo),
SalaryRange::fromOptional));
2. 字符串 API 变更
2.1 字符串缩进
indent 方法有助于更改字符串的缩进。我们可以传递正值或负值,具体取决于我们是要添加更多空格还是删除现有空格。
String result = "foo\nbar\nbar2".indent(4);
System.out.println(result)
// foo
// bar
// bar2
2.2. transform()
字符串转换方法,看代码:
List<String> names = List.of(
" Alex",
"brian");
List<String> transformedNames = new ArrayList<>();
for (String name : names) {
String transformedName = name.transform(String::strip)
.transform(StringUtils::toCamelCase);
transformedNames.add(transformedName);
}
2.3. 字符串常量
从 Java 12 开始,String
类实现了两个额外的接口java.lang.constant.Constable和java.lang.constant.ConstantDesc。
String
类还引入了两个额外的低级方法describeConstable()
和resolveConstantDesc(MethodHandles.Lookup)
.
它们是低级 API,用于提供字节码解析和生成功能的库和工具,例如 Byte Buddy。
请注意,Constable
类型是其值是可以在 Java 类文件的常量池中表示的常量,如JVMS 4.4中所述,并且其实例可以名义上将自己描述为ConstantDesc
.
resolveConstantDesc()
与此类似,describeConstable()
不同之处在于此方法返回的是 C 的实例onstantDesc
。
3. Files.mismatch(path, path)
有时,我们想确定两个文件是否具有相同的内容。此 API 有助于比较文件的内容。
mismatch()
方法比较两个文件路径并返回一个long
值。long 表示两个文件内容中第一个不匹配字节的位置。'–1'
如果文件“相等”,则返回值。
Path helloworld1 = tempDir.resolve("helloworld1.txt");
Path helloworld2 = tempDir.resolve("helloworld2.txt");
long diff = Files.mismatch(helloworld1, helloworld2);
4.紧凑数字格式
由用户界面或命令行工具呈现的大量数字总是难以解析。使用数字的缩写形式更为常见。紧凑的数字表示更容易阅读并且在屏幕上需要更少的空间而不会失去原始含义。
例如3.6 M比3,600,000更容易阅读。
Java 12 引入了一种名为NumberFormat.getCompactNumberInstance(Locale, NumberFormat.Style)的便捷方法,用于创建紧凑的数字表示。
NumberFormat formatter = NumberFormat.getCompactNumberInstance(Locale.US,`` ``NumberFormat.Style.SHORT);` `String formattedString = formatter.format(25000L); ``//25K
5. 支持 Unicode 11
在表情符号在社交媒体渠道交流中发挥关键作用的时代,支持最新的 Unicode 规范比以往任何时候都更加重要。Java 12 保持同步并支持 Unicode 11。
Unicode 11 增加了 684 个字符,总共 137,374 个字符 - 以及 7 个新脚本,总共 146 个脚本。
6.切换表达式(预览)
此更改扩展了switch 语句以便它可以用作语句或表达式。
不必为break
每个 case 块定义一个语句,我们可以简单地使用箭头语法。箭头语法在语义上看起来像一个 lambda,并将 case 标签与表达式分开。
使用新的 switch 表达式,我们可以直接将 switch 语句分配给变量。
boolean isWeekend = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false;
case SATURDAY, SUNDAY -> true;
default -> throw new IllegalStateException("Illegal day entry :: " + day);
};
System.out.println(isWeekend); //true or false - based on current day
要使用此预览功能,我们必须在应用程序启动期间使用–enable-preview标志明确指示 JVM。